WPF之基礎概念

一: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         }

最後看一下效果,注意,咱們的程序並無崩潰。

相關文章
相關標籤/搜索