wpf 第一天

简介: 引用:http://www.cnblogs.com/huangxincheng/archive/2012/06/17/2552322.html 这些天从项目上接触到了wpf,感觉有必要做一个笔记,首篇还是聊聊基本的概念,要学习wpf,我们需要采用webform的思维来考虑问题。

引用: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         }
复制代码

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

相关文章
|
Web App开发 JavaScript 关系型数据库
|
Python Windows
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
|
移动开发 安全 Java
钉钉企业应用网关了解一下
通过企业应用网关,即便该服务器完全在互联网上运行,我们也能够实现“零信任”访问。
2660 1
钉钉企业应用网关了解一下
|
9月前
|
安全 API 决策智能
Workforce 应用示例:黑客松评审团
本文展示了使用CAMEL多智能体系统的Workforce模块创建一个黑客松评审团,通过多个性格各异的智能体协作,对项目进行评审。系统设置了具备不同人格和评审标准的智能体,如注重技术细节的工程师和追求创新的创业者。 评审团对一个基于CAMEL-AI的个性化学习助手项目进行了评价,该项目致力于解决教育个性化不足的问题。智能体们一致认为项目技术扎实、创新性强,但部分功能尚待完善。 文章展示了Workforce模块在复杂任务处理中的高效性,并鼓励将该示例扩展到更多需要多样化视角的应用场景。
363 11
|
7月前
|
机器学习/深度学习 人工智能 云计算
2025年2月阿里云服务器价格与选购指南
随着云计算技术的普及,阿里云在2025年推出了多款高性价比的云服务器产品。本文基于《2025年阿里云服务器收费价格表》,从配置选择、适用场景到优惠活动,为您提供全面的购买参考。涵盖入门级轻量应用服务器、经济型e实例、企业级通用算力型u1实例、高性能服务器及GPU服务器等,适合个人开发者到大型企业的不同需求。详细对比各类配置的价格与性能,并提供抢购秒杀、续费优惠及代金券组合使用等省钱策略,助您降低上云成本。立即访问云小站活动页面领取最新折扣,开启高效云端之旅!
|
数据处理 Apache 流计算
实时计算引擎 Flink:从入门到深入理解
本篇详细介绍了Apache Flink实时计算引擎的基本概念和核心功能。从入门到深入,逐步介绍了Flink的数据源与接收、数据转换与计算、窗口操作以及状态管理等方面的内容,并附带代码示例进行实际操作演示。通过阅读本文,读者可以建立起对Flink实时计算引擎的全面理解,为实际项目中的实时数据处理提供了有力的指导和实践基础。
4761 2
|
存储 关系型数据库 数据库连接
|
自然语言处理 图形学 Windows
electron-builder中NSIS配置项
支持使用不同语言的多个许可证文件-使用lang后缀(例如_de,_ru)。例如,创建文件license_de.txt并license_en.txt在构建资源中。如果操作系统语言为德语,license_de.txt将显示。请参阅语言代码到名称的映射。
|
分布式计算 Hadoop 数据挖掘
从ClickHouse的名字由来讲起
ClickHouse为什么叫ClickHouse ? 你知道它的名称来历吗?
1420 0