您的位置:首页 > 其它

【转载】8天入门wpf—— 第一天 基础概念介绍

2016-10-30 14:42 435 查看


原文链接:http://www.cnblogs.com/huangxincheng/archive/2012/06/17/2552322.html

     
       这些天从项目上接触到了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         }


最后看一下效果,注意,我们的程序并没有崩溃。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: