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来清理应用程序。

http://msdn.microsoft.com/en-us/library/ms157902.aspx

一个关键的区别是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 pointMain()方法与WebApplication的某些类或ApplicationStart()方法相同

Application.Run()具有不同的重载,其中一个是不带参数的。 该方法启动应用程序没有初始forms。

从我的testing,我注意到与DialogResult使用Application.Runbutton不closures窗体(OnFormClosing未命中)与ShowDialog相比,其中与DialogResultbutton打OnFormClosing和closures窗体。