使用模态和非模态形式的区别
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
}
我有一个关于 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
}