如何在子表单处于活动状态时禁用父表单?

时间:2009-07-15 08:54:39

标签: c# winforms

如何在使用c#?

激活子表单时禁用父表单

13 个答案:

答案 0 :(得分:182)

您是否尝试过使用Form.ShowDialog()代替Form.Show()

ShowDialog将您的窗口显示为模态,这意味着在关闭之前您无法与父窗体进行交互。

答案 1 :(得分:37)

您是否通过父表单在您的子表单上调用ShowDialog()Show()

ShowDialog将“阻止”用户与作为参数传递给ShowDialog的表单进行交互。

在父母中你可以称之为:

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

其中this是父表单。

答案 2 :(得分:15)

简单,使用

  Form.ShowDialog();

相反

  Form.Show();

使用Form.ShowDialog()时,在关闭之前,您无法与父表单进行交互。

答案 3 :(得分:10)

可以做的是确保在显示子表单时将父表单作为所有者传递:

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

然后,在子表单中,为ActivatedDeactivate事件设置事件处理程序:

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;
    }
}

然而,这将导致一种真正奇怪的行为;虽然您将无法立即返回并与父表单进行交互,但激活任何其他应用程序将启用它,然后用户可以与其进行交互。

如果您想让孩子成为modal,请改为使用ShowDialog

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

答案 4 :(得分:7)

虽然使用前面提到的childForm.ShowDialog(this)将禁用您的主窗体,但它仍然看起来非常禁用。但是,如果在调用ShowDialog()之后在ShowDialog()和Enable = true之前调用Enabled = false,则主窗体看起来甚至会被禁用。

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;

答案 5 :(得分:6)

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

答案 6 :(得分:4)

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

答案 7 :(得分:4)

@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

希望这有帮助

答案 8 :(得分:3)

您可以使用以下方法执行此操作:

Form3 formshow = new Form3();

formshow.ShowDialog();

答案 9 :(得分:2)

您也可以使用MDIParent-child表单。将子表单的父级设置为MDI Parent

例如

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

在这种情况下,只显示1个表单,子表单将在父表单内。 希望这有帮助

答案 10 :(得分:1)

对我来说,这项工作在这里举例说明当您打开注册表时,主菜单将被禁用。

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

答案 11 :(得分:0)

如果您只是尝试模拟Form.ShowDialog调用但没有阻止任何内容(有点像模拟对话框表单),您可以尝试使用Form.Show(),并在显示模拟对话框表单后立即禁用所有其他窗户使用类似的东西......

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

然后当您关闭&#34;伪对话框表格时#34;一定要打电话....

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

答案 12 :(得分:-2)

为什么不让父母等待孩子关闭。这比你需要的更多。

// Execute child process
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();