WPF应用程序的生命周期
WPF应用程序的生命周期
废话不罗嗦看招:用户双击应用程序--->操作系统启动应用程序--->运行run函数程序启动--->触发一个Startup事件
private void Application_Startup(object sender,StartupEventArgs e) { MainWindow win=new MainWindow(); win.Show(); }
异常登场
说到这我们该说说上文红字“异常”的处理了,人不可能无错,正如程序不可能没有bug,相信大家都在编程中遇到过异常,这里就不废话说异常带来的“灾难”了。不知道什么时候起“突发事件应急处理”这几个字开始活跃在报纸,新闻,广播中,WPF对于“突发事件应急处理”有自己的方法应对,DispacherUnhandledException事件就是异常出现时触发的事件,让我们用实例说话在App.xaml文件中
DispatcherUnhandledException="Application_DispatcherUnhandledException"
DispatcherUnhandledException="Application_DispatcherUnhandledException" 同样在App.xaml.cs文件中我们来看看这个事件处理函数 private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { MessageBox.Show("出错了,看你写的啥代码!!!"); }
private void Button_Click(object sender, RoutedEventArgs e) { Window win = null; win.Show(); }
按Ctrl+F5启动应用程序,点击按钮,看到如下所示
public sealed class DispatcherUnhandledExceptionEventArgs : DispatcherEventArgs { // 摘要: // 获取通过调度程序执行代码时引发的异常。 // // 返回结果: // 异常。 public Exception Exception { get; } // // 摘要: // 获取或设置是否已处理异常事件。 // // 返回结果: // 如果异常已得到处理,则为 true;否则为 false。 public bool Handled { get; set; } }
这两个属性我们在处理异常时都会用的到,刚才我们只是“拦截”了异常,但是没有处理,真正要做到处理,就要这样做,将e.Handled属性设置为true.
private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { e.Handled = true; MessageBox.Show("出错了,看你写的啥代码!!!"); }
SessionEnding="Application_SessionEnding" App.xaml.cs中对应代码: private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) { }
还没有写任何处理代码,先不急我们先来看看这个函数的参数。sender参数代表的是一个WPF应用程序,这个想必我不说大家也知道,那我们就来仔细分析一下第二个参数,F12转到该参数类的定义文件如下:
// 摘要: // 包含 System.Windows.Application.SessionEnding 事件的事件参数。 public class SessionEndingCancelEventArgs : CancelEventArgs { // 摘要: // 获取一个值,该值指示会话结束的原因。 // // 返回结果: // 指示会话结束的原因的 System.Windows.ReasonSessionEnding 值。 public ReasonSessionEnding ReasonSessionEnding { get; } }
// 摘要: // 指定用户会话正在结束的原因。 由 System.Windows.SessionEndingCancelEventArgs.ReasonSessionEnding // 属性使用。 public enum ReasonSessionEnding { // 摘要: // 会话正在结束的原因是用户正在注销。 Logoff = 0, // // 摘要: // 会话正在结束的原因是用户正在关闭 Windows。 Shutdown = 1, }
sorry,原来它是一个枚举,有两个值,很简单,再回过头来我们继续看SessionEndingCancelEventArgs 类。发现它继承CancelEventArgs,说到继承大家都清楚,子类继承父类就具有了父类的属性.让我们看看CancelEventArgs类:
// 摘要: // 获取或设置指示是否应取消事件的值。 // // 返回结果: // 如果应取消事件,则为 true;否则为 false。 public bool Cancel { get; set; }
它就一个属性,Cancel。看到这,聪明的大家该知道如何写SessionEnding处理函数了吧。随便写写,如下:
private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) { e.Cancel = true;//阻止系统关机,重启或注销 string msg = e.ReasonSessionEnding.ToString();//获取程序关闭的原因 }
程序生命周期最后一步,【退出】
应用程序正常退出有三种情况即,关闭主窗口,关闭应用程序的所有窗口及调用ShutDown函数,然而这三种情况又是由我们设定Application的ShutDownMode属性值决定的
看上图,我们来一一解析三个值
OnExplicitShutdown:表示显示调用ShutDown函数关闭应用程序// // 摘要: // 关闭一个应用程序。 public void Shutdown(); // // 摘要: // 关闭将指定退出代码返回给操作系统的应用程序。 // // 参数: // exitCode: // 应用程序的一个整数退出代码。 默认退出代码为 0。 [SecurityCritical] public void Shutdown(int exitCode);
有两种重载,我们主要看第二种,奇怪为啥会有一个所谓的退出代码呢?还有它有什么用呢?
这个问题,下篇随笔再说。也希望知道的前辈指教一二,谢谢!~