C# 如何在子窗体处于活动状态时禁用父窗体?
如何在子窗体使用c#处于活动状态时禁用父窗体?您是否尝试使用而不是C# 如何在子窗体处于活动状态时禁用父窗体?,c#,winforms,C#,Winforms,如何在子窗体使用c#处于活动状态时禁用父窗体?您是否尝试使用而不是 ShowDialog将您的窗口显示为模式窗口,这意味着您在父窗体关闭之前无法与它交互。您是从父窗体调用子窗体上的ShowDialog()还是只调用子窗体上的Show() ShowDialog将“阻止”用户与作为参数传递给ShowDialog的表单交互 在父级中,您可以称为: MyChildForm childForm = new MyChildForm(); childForm.ShowDialog(this); 其中这是父
ShowDialog将您的窗口显示为模式窗口,这意味着您在父窗体关闭之前无法与它交互。您是从父窗体调用子窗体上的
ShowDialog()
还是只调用子窗体上的Show()
ShowDialog
将“阻止”用户与作为参数传递给ShowDialog
的表单交互
在父级中,您可以称为:
MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);
其中这是父窗体。您可以做的是确保在显示子窗体时将父窗体作为所有者传递:
Form newForm = new ChildForm();
newForm.Show(this);
然后,在子窗体中,为激活的
和停用的
事件设置事件处理程序:
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();
虽然使用前面提到的childForm.ShowDialog(此)将禁用主窗体,但它看起来仍然非常禁用。但是,如果在ShowDialog()之前调用Enabled=false,在调用ShowDialog()之后调用Enable=true,则主窗体甚至看起来像被禁用了一样
var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
//在子窗体加载中:
private void ChildForm_Load(object sender, EventArgs e)
{
this.Owner.Enabled = false;
}
private void ChildForm_Closed(object sender, EventArgs e)
{
this.Owner.Enabled = true;
}
来源:您也可以使用MDI父-子表单。将子窗体的父窗体设置为MDI父窗体
乙二醇
在这种情况下,只显示1个表单,子表单将进入父表单中。
希望这有助于它的简单,实用
Form.ShowDialog();
反而
Form.Show();
使用Form.ShowDialog()
抱歉,这不是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);
如果您只是尝试模拟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;
}
您可以通过以下方法实现此目的:
Form3 formshow = new Form3();
formshow.ShowDialog();
-1:你从来不敢在点击/按下/鼠标/按键处理程序中这样做。信息:这个答案是关于流程的,而不是关于表单的。对某人有用,但不能解决问题。这也是一个非常糟糕的主意,如果在GUI线程上执行,您的应用程序GUI将被锁定,直到另一个进程返回。如果出现任何问题,用户将不得不求助于任务管理器来终止您的应用程序。小心使用!或者更好:使用一些异步解决方案,而不是WaitForExit。你不能只使用ChildForm.show然后Mainform.disable/.hide吗?或者你说的是让两个表单同时处于活动状态,当子表单处于活动状态时(激活以禁用主表单),然后打开(取消焦点)重新激活主表单吗?@DonThomasBoyle:嘿,伙计,我正在寻找您所描述的解决方案“同时激活两个窗体,当子窗体(激活以禁用主窗体)然后打开(取消焦点)重新激活主窗体”您能给我一个解决方法的提示吗?我试过线程、application.run等,但都不管用。你怎么知道的?非常感谢!你的主意太棒了!我刚刚发现,它也可以通过与表单父母合作,让孩子与表单父母对接来实现。对我来说很有效!VB.Net版本是这样的:Public childForm As New Childformclass
和childForm.ShowDialog(Me)
其中我是类父(父表单)非常感谢@PhilipYou还可以处理关闭的表单而不是停用的表单,如果您想在子表单的生命周期内禁用父表单,无论其他表单或应用程序在同一时间被激活。当我尝试它时,我发现它隐藏了它,我看不出它是如何工作的。。当我尝试它时,它会隐藏父窗体。这不是隐藏父窗体吗?@barlop要隐藏父窗体,请在父窗体代码中使用this.hide()
。@vee您误读了我的意思。我在问为什么它看起来要把它藏起来(我不想让它藏起来)。我的问题解决了,这是谢谢@R.Martinho Fernandes,这很好用!
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();