使用模态和非模态形式的区别

Difference in using Modal and Non-Modal forms

我有一个关于 using 语句与模态和非模态形式的问题。

当我使用 using 语句时,我想要完成的是相同的行为。

下面是一个与模态表单完美配合的示例。

Dictionary<string, string> input;
using (var window = new Form1()
{
    window.ShowDialog();

    if (window.DialogResult == DialogResult.Cancel)
    {
        return Result.Cancelled;
    }

    input = window.GetInformation();
}

当我将 ShowDialog() 更改为 Show() 时,整个表单不再有效。

我试过不使用 using 语句,但是我无法像上面那样从我那里获取信息。

有没有一种方法可以获得完全相同的结果,但使用 form.Show() 而不是 ShowDialog()

编辑: 当我使用 ShowDialog() 显示来自外部应用程序的表单时,单击外部应用程序时它不会停用。但我使用的是在这种情况下不会触发的 OnDeactivated 事件。所以我尝试了 Show() 并且这似乎有效。

如果问题是为什么 Show() 在 Using 语句中不起作用,那是因为 Show() 是非模态的,所以程序流继续(即不等待 Form 关闭为 ShowDialog () 将)。所以流程继续退出Using,它会处理Using内部创建的对象,包括你创建的Form。这就是它似乎不起作用的原因。

以下是我为解决此问题所做的工作。

我向您正在使用的 class 声明我要显示的全局表单:

private Form1 window;

在我要显示它的函数中:

if (window != null && !window.IsDisposed) window.BringToFront();
else
{
   var window = new Form1();
   window.Show();
   // ... rest of your code here
}

当然,如果您不使用 ShowDialog(),则必须以不同的方式捕获结果。我更喜欢的方法是使用 FormClosing 事件

在实例化表单时添加:

 window.FormClosing += window_FormClosing;

然后在事件处理程序中添加您想要捕获结果的任何代码:

    private void window_FormClosing(object sender, FormClosingEventArgs e)
    {
        Form1 window = sender as Form1;
        // Your code here
    }