当子窗体处于活动状态时,如何禁用父窗体?

如何使用 c # 在子窗体处于活动状态时禁用父窗体?

128612 次浏览

你试过用 表格.ShowDialog ()代替 表格.Show ()吗?

ShowDialog 将窗口显示为模态,这意味着在父窗体关闭之前不能与其交互。

您是从父表单调用子表单上的 ShowDialog()还是仅仅调用 Show()

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

在父母身上,你可以这样称呼:

MyChildForm childForm = new MyChildForm();


childForm.ShowDialog(this);

其中 this是父表单。

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

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

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

如果你想让子代表 模态,使用 ShowDialog代替:

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

为什么不让父母等孩子关门,这已经超出了你的需要。

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

在使用前面提到的 children Form 时。ShowDialog (此)将禁用您的主窗体,它看起来仍然没有非常禁用。但是,如果在 ShowDialog ()之前调用 Enable = false,而在调用 ShowDialog ()之后调用 Enable = true,那么主窗体看起来甚至像是禁用的。

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
ChildForm child = new ChildForm();
child.Owner = this;
child.Show();

//在儿童表格 _ 载入:

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

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

也可以使用 MDIPrent-child 窗体。将子窗体的父窗体设置为 MDIParent

例如

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

在这种情况下,只显示一个表单,并且子表单将出现在父表单中。 希望这个能帮上忙

它简单,使用

Form.ShowDialog();

而不是

Form.Show();

在使用 Form.ShowDialog()时,只有在父窗体关闭时才能与其进行交互。

@ Melodia

对不起,这不是 C # 代码,但这是你想要的,除了翻译这应该很容易。

表格1

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

表格2

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

希望这个能帮上忙

对我来说,这个工作,例如,这里发生的是主菜单将被禁用,当你打开注册表单。

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

如果您只是试图模拟一个。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;
}

你可以这样做:

Form3 formshow = new Form3();


formshow.ShowDialog();

第一条路

MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);

将父窗体设置为 False

Parent.Enabled = false;

确保在子窗体关闭时将其设置为 true