c#如何允许在ShowDialog()方法调用活动表单的情况下访问一些较低级别的表单?

c#如何允许在ShowDialog()方法调用活动表单的情况下访问一些较低级别的表单?,c#,winforms,forms,C#,Winforms,Forms,我得到了一个应用程序,它显示了3个表单:日志窗口,状态窗口,和选项窗口,选项窗口调用了一些其他表单,其中一些表单需要使用showdalog()调用,以返回对话框结果值,以便进一步决策 使用ShowDialog()会引发问题,因为该方法调用的表单排除了其他表单的可访问性 因此,我的问题是,无论调用了多少其他表单,我都希望至少能够访问日志窗口。有没有办法使日志窗口独立于其他表单,或者可以被称为last的表单取代 编辑: 我没有提到ShowDialog()提供的行为在我的应用程序中非常有用,我只是缺乏

我得到了一个应用程序,它显示了3个表单:日志窗口状态窗口,和选项窗口选项窗口调用了一些其他表单,其中一些表单需要使用showdalog()调用,以返回对话框结果值,以便进一步决策

使用ShowDialog()会引发问题,因为该方法调用的表单排除了其他表单的可访问性

因此,我的问题是,无论调用了多少其他表单,我都希望至少能够访问日志窗口。有没有办法使日志窗口独立于其他表单,或者可以被称为last的表单取代

编辑:
我没有提到ShowDialog()提供的行为在我的应用程序中非常有用,我只是缺乏将一个或两个表单从锁定状态中释放出来的能力。切换到Show()不是我认为最好的选择,而ShowDialog()调用的表单父级的其他表单仍然需要锁定。

因此我现在模拟了您的情况并找到了解决方案:

  • 对对话框使用
    Show()
  • 在按下按钮(确定、取消等)后,在对话框中编写一些代码以关闭窗口。因为自动关闭仅适用于
    ShowDialog
    。但是您不需要手动设置
    对话框结果
  • 在选项窗体上,订阅
    FormClosed
    事件以获取
    对话框结果
    。例如:

    dlg.FormClosed += (o, a) => { this.Text = dlg.DialogResult.ToString(); };
    
  • 处理选项窗体的
    激活
    事件,以防止在打开对话框时聚焦于父窗口:

    if (dlg != null) dlg.Focus();
    

  • 此解决方案与ShowDialog的系统行为有所不同,但效果良好。

    您必须在两者之间做出选择

    • 使用
      ShowDialog()
      ,以便父窗体暂停执行,仅在第二个窗体关闭时恢复,或者

    • 使用
      Show()
      ,以便父窗体在显示第二个窗体后继续执行

    如果要执行某些操作,或在第二个表单关闭时从中读取值,请在显示它之前订阅它的
    closed
    事件

    假设第二个表单有一个“First Name”文本框和一个返回该值的属性:

    public string FirstName
    {
        get { return yourFirstNameTextBox.Text; }
    }
    
    在第一种形式中,您可以订阅事件,以便在事件发生时采取一些操作,如下所示:

    var f2 = new SecondForm();
    f2.Closed += (s, e) => MessageBox.Show(f2.FirstName);
    f2.Show();
    
    现在用户可以继续使用这两个表单,当第二个表单关闭时,一个消息框将显示“First Name”文本框的值

    你可能想做一些比这更有意义的事情。您可以不显示消息框,而是更新第一个表单上的字段,或者执行您想要的任何其他操作或操作集

    f2.Closed += (s, e) =>
        {
            MessageBox.Show(f2.FirstName);
            nameLabel.Text = f2.FirstName;
            // another action
            // yet another action
        };
    

    改为使用
    Show()
    。@Prix我不能用ShowDialog()将数据返回到父窗体。我确信返回的数据还不足以作为不使用
    Show()
    而不是
    ShowDialog()
    @JoriO的理由。事实上,ShowDialog()锁定其他窗体并使特定窗体处于最上方并具有所有焦点,并禁用所有其他表单,但在这种情况下,我需要其中一些表单处于活动状态