Как отключить родительскую форму, когда активна дочерняя форма? - PullRequest
69 голосов
/ 15 июля 2009

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

Ответы [ 13 ]

182 голосов
/ 15 июля 2009

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

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

37 голосов
/ 15 июля 2009

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

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

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

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

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

15 голосов
/ 17 сентября 2013

Это просто, используйте

  Form.ShowDialog();

Вместо

  Form.Show();

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

10 голосов
/ 15 июля 2009

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

  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);
7 голосов
/ 15 августа 2013

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

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
6 голосов
/ 20 августа 2013
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-parent-window-only

4 голосов
/ 19 сентября 2013

@ Мелодия

Извините за то, что это не код 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

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

4 голосов
/ 20 августа 2013
Form1 frmnew = new Form1();
frmnew.ShowDialog();
3 голосов
/ 16 января 2018

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

Form3 formshow = new Form3();

formshow.ShowDialog();
2 голосов
/ 20 августа 2013

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

Например

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...