在我的应用程序中,如果登录成功,我希望首先显示登录表单,然后显示主表单。目前,我正在做这样的事情:
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
Application.Run(new MainForm());
但是后来我开始想-- Application.Run()
的意义是什么?为什么不干脆也用(new MainForm()).ShowDialog()
呢?有什么关系呢?什么才是实现我想要的东西的正确方法?
发布于 2010-02-23 07:47:33
Application.Run(Form)
在当前线程上启动消息循环并显示指定的表单。消息循环使窗体能够接收Windows消息(例如,按键、鼠标单击、绘图无效),以使其显示为响应式并与用户进行交互。当您在Form
实例上调用ShowDialog()
时,它实际上做了类似的事情,并为调用ShowDialog
的表单创建了一个模态消息循环。
这两个调用之间没有太大区别。Application.Run
确实添加了一些额外的事件处理,使您能够在关闭主窗体时对资源进行一些整理(请参阅Application.ThreadExit)。
启动WinForms应用程序的推荐方式是使用Application.Run
,但我怀疑这更像是一种惯例,而不是规则。使用Application.Run
的最大原因是您想要打开多个非模式表单。您可以使用以下命令执行此操作:
new Form().Show();
new Form().Show();
Application.Run();
使用ShowDialog()
方法无法实现这一点,因为其中一个表单必须是模态的。
至于您的问题,如果登录成功,如何显示登录表单和主表单,我认为您所拥有的已经很好了:
if (new LoginForm().ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
另一种方法是自己进行检测,如果登录成功,则在LoginForm
的关闭事件中打开MainForm
实例。
发布于 2010-02-23 06:00:31
来自MSDN:
此方法向Closed事件的mainForm参数添加事件处理程序。事件处理程序调用ExitThread来清理应用程序。
http://msdn.microsoft.com/en-us/library/ms157902.aspx
发布于 2011-09-16 02:54:00
从我的测试中,我注意到了以下主要区别:
当使用Application.Run时,窗体的Close按钮(红色X)返回DialogResult.None;但是,当使用ShowDialog时,Close按钮生成DialogResult.Cancel。
这对你来说很重要吗?在我的代码中,我测试了DialogResult.Cancel以确定应用程序的退出代码。当使用红色的X关闭表单时,它被破坏了。我现在测试DialogResult.OK以指示成功退出。
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
https://stackoverflow.com/questions/2314514
复制相似问题