【问题标题】:How to disable the parent form when a child form is active?子窗体处于活动状态时如何禁用父窗体?
【发布时间】:2010-11-10 22:34:29
【问题描述】:

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

【问题讨论】:

  • 你不能只使用 ChildForm.show 然后 Mainform.disable / .hide 或者你是在谈论同时激活 2 个表单并且当子表单处于活动状态时(激活以禁用主表单)然后打开(unfocus) 重新激活主窗体?
  • @DonThomasBoyle:嘿,伙计,我正在寻找您所描述的解决方案“同时有 2 个表单处于活动状态,并且当子表单处于活动状态时(激活以禁用主表单)然后打开(不聚焦)重新激活mainforM”你能给我一个提示如何解决吗?我已经尝试过使用线程、application.run 等,但没有任何效果。你怎么会意识到这一点?

标签: c# winforms


【解决方案1】:

简单好用

Form.ShowDialog();

代替

Form.Show();

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

【讨论】:

  • 当我尝试它时,我发现它隐藏了它
【解决方案2】:

您可以通过以下方式做到这一点:

Form3 formshow = new Form3();

formshow.ShowDialog();

【讨论】:

    【解决方案3】:

    如果您只是尝试模拟 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;
    }
    

    【讨论】:

      【解决方案4】:

      以我为例,这里发生的情况是,当您打开注册表单时,主菜单将被禁用。

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

      【讨论】:

        【解决方案5】:

        @梅洛迪亚

        抱歉,这不是 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
        

        希望对你有帮助

        【讨论】:

        • 非常感谢!你的想法很棒!我刚刚发现它也可以通过与表单父母合作并将孩子与他们对接来工作。
        【解决方案6】:

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

        例如

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

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

        【讨论】:

          【解决方案7】:
          Form1 frmnew = new Form1();
          frmnew.ShowDialog();
          

          【讨论】:

            【解决方案8】:
            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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

              • 我不明白这是如何工作的。当我尝试它时,它会隐藏父表单
              【解决方案10】:

              您是否尝试过使用Form.ShowDialog() 而不是Form.Show()?

              ShowDialog 将您的窗口显示为模态窗口,这意味着您无法与父窗体交互,直到它关闭。

              【讨论】:

              • 这不会隐藏父表单吗?
              • @barlop 隐藏父表单在父表单代码中使用this.Hide()。
              • @vee 你误读了我。我在问为什么它似乎隐藏它(当我不想要它时)。我的问题已解决,这是stackoverflow.com/questions/38171607/…
              • 谢谢@R。 Martinho Fernandes,这很好用!
              【解决方案11】:

              您是在父表单的子表单上调用ShowDialog() 还是只是Show()?

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

              在父级中,您可能会这样调用:

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

              this 是父表单。

              【讨论】:

              • 为我工作! VB.Net 版本是这样的:Public childForm As New Childformclass 和 childForm.ShowDialog(Me) 其中 Me 是班级家长(家长形式)非常感谢@Philip
              【解决方案12】:

              为什么不让父母等待孩子关闭。这超出了您的需要。

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

              【讨论】:

              • -1:你不敢在点击/按下/鼠标/键处理程序中这样做。信息:stackoverflow.com/questions/470256/…
              • 这个答案是关于过程的,而不是关于表格的。对某人有用,但不解决问题。这也是一个非常糟糕的主意,如果在 GUI 线程上完成——你的应用程序 GUI 将被锁定,直到其他进程返回——如果出现任何问题,用户将不得不求助于任务管理器来杀死你的应用程序。谨慎使用!甚至更好:使用一些 ASYNCHRONOUS 解决方案,而不是 WaitForExit。
              【解决方案13】:

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

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

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

              如果要创建子表单modal,请改用ShowDialog:

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

              【讨论】:

              • 如果您想在子表单的生命周期内禁用父表单,也可以处理 Form_Closed 而不是 Form_Deactivate,而不管同时激活其他表单或应用程序。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-13
              • 1970-01-01
              • 2011-08-30
              相关资源
              最近更新 更多