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

本文关键字:表单 方法 调用 活动 访问 情况下 活动表 何允许 较低级 ShowDialog | 更新日期: 2023-09-27 18:26:20

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

使用ShowDialog()会引发问题,导致该方法调用的表单将其他表单排除在可访问范围之外。

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

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

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

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

  • 使用ShowDialog(),以便父窗体暂停执行,并且只有在第二个窗体或关闭时才恢复执行

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

如果你想采取一些行动,或者在第二个表单关闭时从中读取值,那么在显示它之前订阅它的Closed事件

假设您的第二个表单有一个"名字"TextBox和一个返回该值的属性:

public string FirstName
{
    get { return yourFirstNameTextBox.Text; }
}

在你的第一个表单中,你可以订阅一个事件,以便在事件发生时采取一些行动,比如:

var f2 = new SecondForm();
f2.Closed += (s, e) => MessageBox.Show(f2.FirstName);
f2.Show();

现在,用户可以继续使用这两个表单,当第二个表单关闭时,一个消息框将显示"名字"TextBox的值。

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

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

所以我现在为您的情况建模并找到了解决方案:

  1. 使用Show()代替ShowDialog()进行对话
  2. 在对话框中写一些代码,在按下按钮(确定、取消等)后关闭它的窗口。因为自动关闭只适用于ShowDialog。但是您不需要手动设置DialogResult
  3. 在Options表单中,订阅FormClosed事件以获得DialogResult。例如:

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

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

该解决方案与ShowDialog的系统性能有一定差异,但效果良好。