8天入門wpf—— 第一天 基礎概念介紹


     

       這些天從項目上接觸到了wpf,感覺有必要做一個筆記,首篇還是聊聊基本的概念,要學習wpf,我們需要采用webform的思維來考慮問題。

 

一:App環境承載

     我們都知道,console和winform程序的入口函數都是main,wpf同樣也不例外,好了,我們新建一個wpf的程序,vs自動給我們生成了一個

MainWindow.xaml和App.xaml文件。

 

微軟官方說wpf程序是從Application開始的,既然是開始總有個入口點吧,奇怪的是我們並沒有發現Main函數,程序又是如何Run起來的呢?

其實,wpf為了簡化我們的工作,把一些機械性的代碼透明了,那么我們如何找到這個Main函數呢?很簡單,我們編譯一下程序,發現

App.xaml最后生成了App.g.cs的部分類,並且發現StartupUri是MainWindow.xaml,也就是說程序一運行,MainWindow.xaml將會啟動。

 

二:Wpf中Application的生命周期

    我們知道webform中的Global文件定義了一個應用程序的全局生命周期,或許有人問,生命周期能夠干些什么,其實干的事情可多着呢,

比如我們可以做一些身份驗證,或者一些信息的初始化,那么wpf中到底有哪些對應的方法和事件呢?

1:OnStartup方法    =>   Startup 事件

     這個就見名識意了,也就是上面一幅圖中的app.Run()的時候觸發。

2: OnSessionEnding方法 => SessionEnding 事件

     系統關機前調用。

3:OnExit方法 => Exit事件

     應用程序關閉前調用。

4:OnActivated方法 =>  Activated 事件

     應用程序獲得焦點的時候觸發。

5: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 Demo
 9 {
10     /// <summary>
11     /// App.xaml 的交互邏輯
12     /// </summary>
13     public partial class App : Application
14     {
15         protected override void OnActivated(EventArgs e)
16         {
17             base.OnActivated(e);
18 
19             //TODO  your code
20         }
21 
22         protected override void OnDeactivated(EventArgs e)
23         {
24             base.OnDeactivated(e);
25 
26             //TODO  your code
27         }
28 
29         protected override void OnExit(ExitEventArgs e)
30         {
31             base.OnExit(e);
32 
33             //TODO  your code
34         }
35 
36         protected override void OnStartup(StartupEventArgs e)
37         {
38             base.OnStartup(e);
39 
40             //TODO  your code
41         }
42 
43         protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
44         {
45             base.OnSessionEnding(e);
46         
47             //TODO  your code
48         }
49     }
50 }

 

三:全局異常獲取

     在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         }

最后看一下效果,注意,我們的程序並沒有崩潰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM