在我的应用程序中,我想首先显示登录表单,然后在登录成功时显示主表单.目前我正在这样做:
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
Application.Run(new MainForm());
Run Code Online (Sandbox Code Playgroud)
但后来我开始疑惑 - 这有什么意义Application.Run()呢?为什么不做(new MainForm()).ShowDialog()呢?有什么不同?什么是实现我想要的正确方法?
adr*_*nks 66
Application.Run(Form)在当前线程上启动消息循环并显示指定的表单.消息循环使表单能够接收Windows消息(例如,按键,鼠标点击,绘制失效),以使其显示响应并与用户进行交互.当你调用ShowDialog()一个Form实例时,它实际上做了类似的事情,并为ShowDialog已调用的表单创建一个模态消息循环.
两个电话之间没有太大区别.Application.Run确实添加了一些额外的事件处理,使您可以在主窗体关闭时进行一些资源整理(请参阅Application.ThreadExit).
启动WinForms应用程序的推荐方法是使用Application.Run,但我怀疑这更像是一个约定而非规则.使用的最大原因Application.Run是如果要打开多个非模态表单.你可以这样做:
new Form().Show();
new Form().Show();
Application.Run();
Run Code Online (Sandbox Code Playgroud)
您无法使用该ShowDialog()方法实现此目的,因为其中一个表单必须是模态的.
关于如何显示登录表单的问题,然后如果登录成功则显示主表单,我认为你有什么好处:
if (new LoginForm().ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是自己进行管道工作,并在登录成功MainForm的结束事件中打开一个实例LoginForm.
来自MSDN:
此方法将事件处理程序添加到Closed事件的mainForm参数.事件处理程序调用ExitThread来清理应用程序.
http://msdn.microsoft.com/en-us/library/ms157902.aspx
小智 5
从我的测试中,我注意到了这个主要区别:
使用Application.Run时,表单的"关闭"按钮(红色X)返回DialogResult.None; 但是,使用ShowDialog时,"关闭"按钮会生成DialogResult.Cancel.
这对你很重要吗?在我的代码中,我正在测试DialogResult.Cancel以确定我的应用程序的退出代码.当红色X用于关闭表格时,这被打破了.我现在测试DialogResult.OK以表示成功退出.
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)