博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf 第一天
阅读量:6271 次
发布时间:2019-06-22

本文共 3570 字,大约阅读时间需要 11 分钟。

引用:

这些天从项目上接触到了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     /// 11     /// App.xaml 的交互逻辑12     /// 13     public partial class App : Application14     {15         protected override void OnActivated(EventArgs e)16         {17             base.OnActivated(e);18 19             //TODO  your code20         }21 22         protected override void OnDeactivated(EventArgs e)23         {24             base.OnDeactivated(e);25 26             //TODO  your code27         }28 29         protected override void OnExit(ExitEventArgs e)30         {31             base.OnExit(e);32 33             //TODO  your code34         }35 36         protected override void OnStartup(StartupEventArgs e)37         {38             base.OnStartup(e);39 40             //TODO  your code41         }42 43         protected override void OnSessionEnding(SessionEndingCancelEventArgs e)44         {45             base.OnSessionEnding(e);46         47             //TODO  your code48         }49     }50 }

 

三:全局异常获取

     在webform中的Global文件中有一个Application_Error方法,专门用来捕获整个应用程序的异常,以至于不会出现“黄白页”给用户,以此来提高

系统的健壮性和安全性,那么wpf中也有类似的方法吗?当然,wpf跟webform神似,他有的我也有,这里是一个DispatcherUnhandledException

事件,然后我们在OnStartup注册一下就Ok了。

1 namespace Demo 2 { 3     ///  4     /// App.xaml 的交互逻辑 5     ///  6     public partial class App : Application 7     { 8         protected override void OnStartup(StartupEventArgs e) 9         {10             base.OnStartup(e);11 12             //注册Application_Error13             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     ///  4     /// MainWindow.xaml 的交互逻辑 5     ///  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         }

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

转载地址:http://doopa.baihongyu.com/

你可能感兴趣的文章
Ubuntu C/C++开发环境的安装和配置
查看>>
百世汇通快递地区选择插件,单独剥离
查看>>
Linux系统调用---同步IO: sync、fsync与fdatasync【转】
查看>>
【MyBatis学习06】输入映射和输出映射
查看>>
[LeetCode] Decode String 解码字符串
查看>>
数字逻辑的一些基本运算和概念
查看>>
ant重新编译打包hadoop-core-1.2.1.jar时遇到的错
查看>>
【★★★★★】提高PHP代码质量的36个技巧
查看>>
3 weekend110的配置hadoop(格式化) + 一些问题解决 + 未免密码配置
查看>>
JavaScript Creating 对象
查看>>
Java compiler level does not match the version of the installed Java project facet.(转)
查看>>
WPF MediaElement.Position属性
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
spring mysql多数据源配置
查看>>
[React] Override webpack config for create-react-app without ejection
查看>>
检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。...
查看>>
测试java的父子类化
查看>>
HDOJ 1008
查看>>
安装thrift出现的一些问题
查看>>
makefile编写---单个子目录编译模板
查看>>