Как отключить родительскую форму, когда активна дочерняя форма?

Как отключить родительскую форму, когда дочерняя форма активна с помощью C #?

 Don Thomas Boyle19 авг. 2013 г., 16:29
Не можете ли вы просто использовать ChildForm.show, затем Mainform.disable / .hide или вы говорите о том, чтобы одновременно активными были 2 формы, а когда дочерняя форма активна (отключена основная), затем включена (не фокусирована), повторно активируйте mainforM ?
 melodia19 сент. 2013 г., 15:05
@DonThomasBoyle: эй, мужик, я ищу именно твоё описанное решение, в котором одновременно активны 2 формы, а когда дочерняя форма (активна для отключения основной), то включена (не фокусируется), повторно активируй mainforM & quot; Вы можете дать мне подсказку, как решить это? я пробовал это с помощью threading, application.run и т. д., но ничего не работает. как бы вы поняли это?

Ответы на вопрос(13)

ChildForm child = new ChildForm();
child.Owner = this;
child.Show();

// В ChildForm_Load:

private void ChildForm_Load(object sender, EventArgs e) 
{
  this.Owner.Enabled = false;
}

private void ChildForm_Closed(object sender, EventArgs e) 
{
  this.Owner.Enabled = true;
} 

источник :http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block-the- родитель окна только

Это просто, использовать

  Form.ShowDialog();

Вместо

  Form.Show();

При использованииForm.ShowDialog()вы не можете взаимодействовать с родительской формой, пока она не закроется.

 03 июл. 2016 г., 15:39
когда я пытаюсь это найти, то это скрывает это

@Melodia

Извините за то, что это не код C #, но это то, что вы хотели бы, кроме перевода это должно быть легко.

FORM1

Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
    Me.Focus()
    Me.Enabled = True
    Form2.Enabled = False
End Sub

Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
    Form2.Enabled = True
    Form2.Focus()
End Sub

FORM2

Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
    Me.Focus()
    Me.Enabled = True
    Form1.Enabled = False
End Sub

Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
    Form1.Enabled = True
    Form1.Focus()
End Sub

Надеюсь это поможет

 19 сент. 2013 г., 16:16
большое спасибо! твоя идея отличная! я только что узнал, что он также работает, работая с формальными родителями и приставляя к ним детей.

Вы пытались использоватьForm.ShowDialog () вместоForm.Show ()?

ShowDialog показывает ваше окно как модальное, что означает, что вы не можете взаимодействовать с родительской формой, пока она не закроется.

 19 мар. 2018 г., 10:53
большое спасибо вам :)
 03 июл. 2016 г., 15:46
не скрывает ли это родительскую форму?
 12 мар. 2017 г., 05:33
@barlop, чтобы скрыть использование родительской формыthis.Hide() в родительском коде формы.
 10 апр. 2018 г., 16:28
Спасибо @R. Мартиньо Фернандес, это прекрасно работает!
 12 мар. 2017 г., 20:39
@vee Ты неправильно меня понял. Я спрашивал, почему это казалось скрытым (когда я этого не хотел). Моя проблема решена былаstackoverflow.com/questions/38171607/…

Если вы просто пытаетесь смоделировать вызов Form.ShowDialog, но БЕЗ блокирования чего-либо (что-то вроде формы смоделированного диалога), вы можете попробовать использовать Form.Show () и, как только вы отобразите форму смоделированного диалогового окна, немедленно отключите все другие окна, используя что-то вроде...

private void DisableAllWindows()
{
foreach (Form f in Application.OpenForms)
if (f.Name != this.Name)f.Enabled = false;
else f.Focus();
}

Затем, когда вы закроете свою «псевдо-диалоговую форму» обязательно позвони ....

private void EnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}

Что тыcould do, это обязательно передать родительскую форму в качестве владельца при отображении дочерней формы:

  Form newForm = new ChildForm();
  newForm.Show(this);

Затем в дочерней форме установите обработчики событий дляActivated а такжеDeactivate События:

private void Form_Activated(object sender, System.EventArgs e)
{
    if (this.Owner != null)
    {
        this.Owner.Enabled = false; 
    }
}

private void Form_Deactivate(object sender, System.EventArgs e)
{
    if (this.Owner != null)
    {
        this.Owner.Enabled = true;
    }
}

Однако это приведет к действительно странному поведению; пока вы не сможете сразу вернуться и взаимодействовать с родительской формой, активация любого другого приложения включит ее, и тогда пользователь сможет взаимодействовать с ней.

Если вы хотите сделать детскую формумодальныйиспользоватьShowDialog вместо:

  Form newForm = new ChildForm();
  newForm.ShowDialog(this);
 23 февр. 2016 г., 17:25
Вы также можете обрабатывать Form_Closed вместо Form_Deactivate, если вы хотите отключить родительскую форму на время жизни дочерней формы, независимо от того, какие другие формы или приложения были активированы в это время.

Хотя использование ранее упомянутого childForm.ShowDialog (this) отключит вашу основную форму, она все еще выглядит очень отключенной. Однако, если вы вызываете Enabled = false перед ShowDialog () и Enable = true после вызова ShowDialog (), основная форма даже будет выглядеть как отключенная.

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
 03 июл. 2016 г., 15:41
Я не вижу, как это может работать ... при попытке скрыть родительскую форму

Вы также можете использовать форму MDIParent-child. Установите родителя дочерней формы в качестве MDI Parent

Например

child.MdiParent = parentForm;
child.Show();

В этом случае будет показана только 1 форма, а дочерние формы появятся внутри родительской. Надеюсь это поможет

Ты звонишьShowDialog() или простоShow() на вашей детской форме от родительской формы?

ShowDialog будет "блокировать" пользователь от взаимодействия с формой, которая передается в качестве параметраShowDialog.

Внутри родителя вы можете назвать что-то вроде:

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

гдеthis это родительская форма.

 31 мар. 2014 г., 18:00
Работает для меня! Версия VB.Net это:Public childForm As New Childformclass а такжеchildForm.ShowDialog(Me) где Me - родитель класса (родительская форма) большое спасибо @Philip

Почему бы просто не попросить родителей подождать, пока ребенок закроется. Это больше, чем вам нужно.

// Execute child process
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();
 25 июн. 2014 г., 02:05
Этот ответ о ПРОЦЕССАХ, а не о ФОРМАХ. Полезно для кого-то, но не решает вопрос. Это также очень плохая идея, если сделать это в потоке графического интерфейса - графический интерфейс вашего приложения будет заблокирован до тех пор, пока не завершится другой процесс - если что-то пойдет не так, пользователю придется прибегнуть к диспетчеру задач для уничтожения вашего приложения. ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ! Или даже лучше: используйте какое-нибудь АСИНХРОННОЕ решение, а не WaitForExit.
 13 авг. 2013 г., 10:13
-1: не смей делать это в обработчиках click / press / mouse / key. Информация:stackoverflow.com/questions/470256/…

Вы можете сделать это с помощью следующего:

Form3 formshow = new Form3();

formshow.ShowDialog();
Form1 frmnew = new Form1();
frmnew.ShowDialog();

Для меня эта работа, например, вот что произойдет, главное меню будет отключено при открытии формы регистрации.

 frmUserRegistration frmMainMenu = new frmUserRegistration();
    frmMainMenu.ShowDialog(this);

Ваш ответ на вопрос