一:App環境承載web
咱們都知道Console和WinForm程序的入口都是Main函數,WPF一樣也不例外,好了,咱們就新建一個WPF應用程序,VS會給咱們自動生成一個MainWindow.xaml和App.xaml文件。安全
微軟官方說WPF程序是從Application開始的,既然是開始總有個入口點吧,奇怪的是咱們並無發現Main函數,程序又是如何Run起來的呢?app
其實,wpf爲了簡化咱們的工做,把一些機械性的代碼透明瞭,那麼咱們如何找到這個Main函數呢?很簡單,咱們編譯一下程序,發現ide
App.xaml最後生成了App.g.cs的部分類,而且發現StartupUri是MainWindow.xaml,也就是說程序一運行,MainWindow.xaml將會啓動。函數
二:WPF中Application的生命週期this
咱們知道webform中的Global文件定義了一個應用程序的全局生命週期,或許有人問,生命週期可以幹些什麼,其實幹的事情可多着呢,spa
好比咱們能夠作一些身份驗證,或者一些信息的初始化,那麼wpf中到底有哪些對應的方法和事件呢?日誌
一、OnStartup方法 => Startup事件code
這個就見名識意了,在上圖中app.Run()時觸發。orm
二、OnSessionEnding方法 =>SessionEnding 事件
系統關機前調用
三、OnExit方法 => Exit事件
應用程序關閉前調用。
四、OnActivated方法 => Activated 事件
應用程序得到焦點的時候觸發。
五、OnDeactivated方法 => DeActivated事件
應用程序失去焦點的時候觸發。
1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Data; 5 using System.Linq; 6 using System.Windows; 7 8 namespace Wpf_Template 9 { 10 /// <summary> 11 /// App.xaml 的交互邏輯 12 /// </summary> 13 public partial class App : Application 14 { 15 protected override void OnStartup(StartupEventArgs e) 16 { 17 base.OnStartup(e); 18 19 //TODO your code 20 } 21 protected override void OnSessionEnding(SessionEndingCancelEventArgs e) 22 { 23 base.OnSessionEnding(e); 24 25 //TODO your code 26 } 27 protected override void OnActivated(EventArgs e) 28 { 29 base.OnActivated(e); 30 31 //TODO your code 32 } 33 protected override void OnDeactivated(EventArgs e) 34 { 35 base.OnDeactivated(e); 36 37 //TODO your code 38 } 39 protected override void OnExit(ExitEventArgs e) 40 { 41 base.OnExit(e); 42 43 //TODO your code 44 } 45 } 46 }
三:全局異常獲取
在webform中的Global文件中有一個Application_Error方法,專門用來捕獲整個應用程序的異常,以致於不會出現「黃白頁」給用戶,以此來提升
系統的健壯性和安全性,那麼wpf中也有相似的方法嗎?固然,wpf跟webform神似,他有的我也有,這裏是一個DispatcherUnhandledException
事件,而後咱們在OnStartup註冊一下就Ok了。
1 namespace Demo 2 { 3 /// <summary> 4 /// App.xaml 的交互邏輯 5 /// </summary> 6 public partial class App : Application 7 { 8 protected override void OnStartup(StartupEventArgs e) 9 { 10 base.OnStartup(e); 11 12 //註冊Application_Error 13 this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 14 15 } 16 17 //異常處理邏輯 18 void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 19 { 20 //處理完後,咱們須要將Handler=true表示已此異常已處理過 21 e.Handled = true; 22 } 23 } 24 }
好,下面咱們作了示例:
首先咱們拖一個button,事件處理中故意拋出異常。
1 namespace Demo 2 { 3 /// <summary> 4 /// MainWindow.xaml 的交互邏輯 5 /// </summary> 6 public partial class MainWindow : Window 7 { 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 private void button1_Click(object sender, RoutedEventArgs e) 14 { 15 throw new Exception("我就害你,我就拋異常"); 16 } 17 } 18 }
而後咱們在Application_Error中進行處理,固然實際應用中應該是記一些log日誌。
1 //異常處理邏輯 2 void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 3 { 4 MessageBox.Show("誰tmd惹禍了:" + e.Exception.Message); 5 6 //處理完後,咱們須要將Handler=true表示已此異常已處理過 7 e.Handled = true; 8 }
最後看一下效果,注意,咱們的程序並無崩潰。