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

C# 如何在子窗体处于活动状态时禁用父窗体?,c#,winforms,C#,Winforms,如何在子窗体使用c#处于活动状态时禁用父窗体?您是否尝试使用而不是 ShowDialog将您的窗口显示为模式窗口,这意味着您在父窗体关闭之前无法与它交互。您是从父窗体调用子窗体上的ShowDialog()还是只调用子窗体上的Show() ShowDialog将“阻止”用户与作为参数传递给ShowDialog的表单交互 在父级中,您可以称为: MyChildForm childForm = new MyChildForm(); childForm.ShowDialog(this); 其中这是父

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

您是否尝试使用而不是


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();