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         }

最后看一下效果,注意,咱们的程序并无崩溃。

相关文章
相关标签/搜索