在我提出最近的一个问题(Here)时,Hans Passant表示我应该将 DialogResult
设置为关闭我的窗体,而不是 form.Close()
,但我无法弄清楚为什么?
如果我阅读得正确,MSDN 文档表明这样做只会隐藏窗体,而不是像我所认为的那样正确地处理它,使用 .Close()
操作可以正确处理窗体?
Extract 来自文档。
当用户单击对话框的关闭按钮或设置 DialogResult 属性的值时,不会自动调用 Close 方法。相反,窗体将被隐藏,可以再次显示而不创建新的对话框实例。由于此行为,当您的应用程序不再需要该窗体时,必须调用窗体的 Dispose 方法。
另外,微软创建了一个支持页面,介绍了如何使用DialogResult属性,在“验证它是否起作用”部分中指出点击后将关闭表单。
所以我的问题有两个方面,我应该继续使用Close还是DialogResult;而且DialogResult是否关闭或隐藏表单。从下面的代码中(一个简单的带有两个按钮的表单),似乎只是被隐藏了,因为当命中this.Close()
时会触发断点..(注释掉this.Close()
,表单仍然消失,只是不确定是否已经隐藏)
public Form1()
{
InitializeComponent();
button1.Click += (s, e) =>
{
//I edited my question to include using
using(Form1 form = new Form1())
{
form.ShowDialog();
}
};
button2.Click += (s, e) =>
{
this.DialogResult = DialogResult.OK;
this.Close();
};
}
using
来处理Dispose()
概念,就像这里的两个答案一样。另一个概念是设置DialogResult
来指示对话框关闭的方式,以便启动对话框的代码可以在必要时知道如何响应。通常你可能会忽略结果,但这取决于对话框的创建者。对话框应始终报告关闭的原因,以便创建者有选择的余地。(如果它只有一个退出状态,那当然没关系) - Matthew WatsonDialogResult
时,它在窗体的消息循环从处理 Windows 消息返回之前没有任何效果。例如,如果你在窗体的构造函数中这样做:Task.Run(() => {Thread.Sleep(1000);this.DialogResult = DialogResult.Cancel;});
如果你将鼠标远离窗体,什么也不会发生,但是当你将鼠标移到上面时,它突然关闭。 - Matthew Watsonreturn
、break
、continue
、goto
.. 任何短路方法的东西。 - Sayse