关于WPF的退出
2020-12-13 14:11
标签:style blog http io os ar for sp on 如果你在创建项目的时候细心的查看一下项目的结构,你会发现里面有一个App.xaml,一见到App我们知道是应用程序的关键了配置了,当然,WPF的启动窗体也在这里面设置的。 我们可以在App的中配置启动页,如下所示: 当然,我们还可以再App.cs重写OnStartUp来设置要启动的页面来设置启动的页面,如: public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { new Login().Show(); base.OnStartup(e); } } 程序的退出看着挺简单的,调用App.Current.Shutdown();则程序就退出了,这仅适用于简单的情况,接下来用实际的测试来说话: 最简的请框如上一篇的登录窗口,我们给Cancel按钮添加一个事件(以后会详细介绍,现在就双击OK了),然后再里面实现。WPF的退出方法如下所示的: this.Close();// 关闭当前窗口,可以在OnClosing和 OnClosed中捕获消息,在OnClosing的时候,可以取消关闭窗口。 Environment.Exit(0);// 强制退出,即使有其他的线程没有结束 Application.Current.Shutdown();// 关闭当前程序,如果有其他线程没有结束,不会关闭 App.Current.Shutdown();// 同Application,没有和App区分出来。 接下来贴出代码: 测试代码如下: public Login() { InitializeComponent(); //new MainWindow().Show(); this.Closing += (s, r) => { // 我不是想真的退出,我想保持最小托盘 Debug.WriteLine("I‘am running,and change status"); r.Cancel = true; Debug.WriteLine("I‘am backing"); }; this.Closed += (s, r) => { // 退出了啊 Debug.WriteLine("I‘am Closed"); }; //new Thread(() => { while (true) { Thread.Sleep(100); Debug.WriteLine("I‘am Running"); } }).Start(); } 当我们没有启动新线程的时候,打印的消息如下: 开始的时候,仅仅在Login中调用不同的方法,打印的消息如下所示: //输出: //I‘am running,and change status //I‘am backing // 程序没有退出 //this.Close(); //输出: //没有输出任何消息,没有调用Closed和Closing // 程序强制退出 //Environment.Exit(0); //输出: //I‘am running,and change status 执行了方法,但是程序还是强制退出了 //I‘am backing //I‘am Closed // 程序强制退出 //Application.Current.Shutdown(); //输出: //I‘am running,and change status 执行了方法,但是程序还是强制退出了 //I‘am backing //I‘am Closed //force closed // 程序强制退出 //App.Current.Shutdown(); 当我们启用新线程的时候,则除Environment.Exit(0),打印几个I‘am Running之后,程序就完全退出了,但是其他的都没有提出系统。 那么Close在什么时候会退出程序呢? 如过调用了Close,而在Closing中没有显示的取消退出,则系统可以退出,这种情况仅仅是在没有多余线程,没有其他窗口启动的时候,如果有其他窗口同时启动,则要考虑App.Current.ShutdownMode。 如果在App里面显示的或者退出系统之前显示的设置了App.Current.ShutdownMode,此时系统也不会有退出不完全的情况,当系统App.Current.ShutdownMode=OnMainWindowClose的时候,此时如果,调用主窗口的Close,则系统会退出(没有残余线程的情况),即使在主窗口中又弹出了其他的窗口。如果设置了App.Current.ShutdownMode=OnLastWindowClose,则此时系统不会关闭,什么时候关闭呢?所有的弹出窗口都关闭的情况下会退出系统(没有残余线程的情况)。 当设置App.Current.ShutdownMode=OnExplicitShutdown的时候,此时较复杂,此时无论什么样的顺序调用Close都不会关闭窗口,必须显示的调用Application.Current.ShutDown()方法,系统才会退出。 总结一下退出就是:Close->Application.Current.ShutDow()->Enviroment.Exit(0) 弱-------------------------------------------------> 强 Close->退出系统时候要看App的ShutDownModel设置 如果系统有为释放的线程,或者先释放掉,或者调用Enviroment.Exit(0) 强制回收,关闭系统。 关于WPF的退出 标签:style blog http io os ar for sp on 原文地址:http://www.cnblogs.com/fuchongjundream/p/4059217.html