Application.Run()和Form.ShowDialog()有什么区别?
在我的应用程序中,我想先显示一个login表单,然后显示login成功的主窗体。 目前我正在做这样的事情:
var A = new LoginForm(); if ( A.ShowDialog() == DialogResult.OK ) Application.Run(new MainForm());
但后来我开始怀疑 – Application.Run()
什么意义? 为什么不只是做(new MainForm()).ShowDialog()
以及? 有什么不同? 什么是正确的方式来实现我想要的?
Application.Run(Form)
在当前线程上启动一个消息循环,并显示指定的表单。 消息循环使窗体能够接收Windows消息(例如按下按键,鼠标点击,绘制失效),以使其显示为响应并与用户进行交互。 在Form
实例上调用ShowDialog()
时,它实际上会做类似的事情,并为调用ShowDialog()
的Form
创build模态消息循环。
这两个电话之间没有太大的区别。 Application.Run
确实添加了一些额外的事件处理,使您可以在主窗体closures时进行一些资源整理(请参阅Application.ThreadExit )。
启动WinForms应用程序的推荐方法是使用Application.Run
,但我怀疑这是一个惯例而不是规则。 使用Application.Run
的最大的原因是如果你想打开多个非模态表单。 你可以这样做:
new Form().Show(); new Form().Show(); Application.Run();
你不能使用ShowDialog()
方法来实现这一点,因为其中一种forms必须是模态的。
至于你如何显示login表单,然后如果login成功的主要forms的问题,我认为你有什么是好的:
if (new LoginForm().ShowDialog() == DialogResult.OK) { Application.Run(new MainForm()); }
另一种方法是自己完成pipe道工作,如果login成功,则在LoginForm
的closures事件中打开MainForm
一个实例。
从我的testing中,我注意到了这个主要区别:
使用Application.Run时,窗体的closuresbutton(红色X)返回DialogResult.None; 但是,使用ShowDialog时,closuresbutton会生成DialogResult.Cancel。
这对你有影响吗? 在我的代码中,我正在testingDialogResult.Cancel来确定我的应用程序的退出代码。 当红色的X被用于closures表单时,这被打破了。 我现在testingDialogResult.OK表示一个成功的退出。
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
来自MSDN:
此方法将事件处理程序添加到Closed事件的mainForm参数。 事件处理程序调用ExitThread来清理应用程序。
一个关键的区别是ShowDialog通常是一个modal dialog。 如果你想创build一个用户友好的工具集,你不希望它由模式对话框组成。
此外,Application.Run()接受的不仅仅是一个表单。 它有一些重载。
至于你的申请,我觉得这不重要。 Application.Run对我来说是有意义的,因为它表示实际应用程序的开始。
过载文件
public static void Run( ApplicationContext context );
有一个很好的例子,涉及两种forms的不同方法。
有关不同之处的更多例子:
如果您的主窗体是一个MDI窗体,那么单击closuresbutton(右上angular的“x”或Alt-F4)的行为是不同的,这取决于您使用哪种方法来显示窗体。
使用Application.Run(mainForm)
,子窗体的closures事件运行,然后主窗体的closures事件运行。
通过mainForm.ShowDialog
,主窗体的closures事件运行,并且子窗体的closures事件不运行。
Application.Run()
用于应用程序的开始,而MainForm
是应用程序和MainForm()).ShowDialog()
一部分MainForm()).ShowDialog()
仅用于显示它。
Application.Run()
是您的应用程序的entry point
。 Main()
方法与WebApplication的某些类或ApplicationStart()
方法相同
Application.Run()具有不同的重载,其中一个是不带参数的。 该方法启动应用程序没有初始forms。
从我的testing,我注意到与DialogResult使用Application.Runbutton不closures窗体(OnFormClosing未命中)与ShowDialog相比,其中与DialogResultbutton打OnFormClosing和closures窗体。