一: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事件

应用程序失去焦点的时候触发。

 using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows; namespace Wpf_Template
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e); //TODO your code
}
protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
{
base.OnSessionEnding(e); //TODO your code
}
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e); //TODO your code
}
protected override void OnDeactivated(EventArgs e)
{
base.OnDeactivated(e); //TODO your code
}
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e); //TODO your code
}
}
}

三:全局异常获取

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

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

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

 namespace Demo
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e); //注册Application_Error
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); } //异常处理逻辑
void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//处理完后,我们需要将Handler=true表示已此异常已处理过
e.Handled = true;
}
}
}

好,下面我们做了示例:

首先我们拖一个button,事件处理中故意抛出异常。

 namespace Demo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void button1_Click(object sender, RoutedEventArgs e)
{
throw new Exception("我就害你,我就抛异常");
}
}
}

然后我们在Application_Error中进行处理,当然实际应用中应该是记一些log日志。

 //异常处理逻辑
void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("谁tmd惹祸了:" + e.Exception.Message); //处理完后,我们需要将Handler=true表示已此异常已处理过
e.Handled = true;
}

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

WPF之基础概念的更多相关文章

  1. WCF分布式开发步步为赢(1):WCF分布式框架基础概念

    众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...

  2. WPF 排版基础

    一.WPF 排版基础 WPF使用控制面板来进行排版,控制面板实际上是一种可以放入WPF界面元素的容器.当用户把界面元素放入控制面板后,WPF会自动把这些界面元素放在它认为合适的地方.WPF开发人员需要 ...

  3. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  4. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  5. Jmeter基础之---jmeter基础概念

    Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...

  6. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  7. 理解 angular2 基础概念和结构 ----angular2系列(二)

    前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...

  8. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

  9. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

随机推荐

  1. poj 1079 Calendar Game(博弈论 SG)

    Calendar Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. SQL 怎样 远程备份数据库到本地

    SQL 怎样 远程备份数据库到本地 --1.启用xp_cmdshell USE master EXEC sp_configure 'show advanced options', 1 RECONFIG ...

  3. 解决Linux上解压jdk报错gzip: stdin: not in gzip format

    最近在阿里上买了个服务器玩,需要安装jdk,在解压过程中遇到了一些问题,又是一番Google度娘,终于解决了.问题原因让我有点无奈…… 输入 #tar -xvf jdk-8u131-linux-x64 ...

  4. Shell计算器

    #!/bin/bash # filename : jisuan.sh # description : add, subtract, multiply, and divide print_usage() ...

  5. printf()与 scanf()

    一直以来就没有认真看过控制台输入输出的格式,现今找了一些材料,分享如下: 1. 格式化规定符     Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ ...

  6. Truck History - poj 1789 (Prim 算法)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20884   Accepted: 8075 Description Ad ...

  7. CyclicBarrier的工作原理及其实例

    CyclicBarrier是多线程中一个重要的类,主要用于线程组内部之间的线程的相互等待问题. 1.CyclicBarrier的工作原理 CyclicBarrier大致是可循环利用的屏障,顾名思义,这 ...

  8. 开发app应用的开源项目推荐

    app检测内存泄漏 请看这里:LeakCanary Android 和 Java 内存泄露检测 app应用想要控制状态栏 StatusBarUtil :https://github.com/laobi ...

  9. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...

  10. 列表按照字母排序检索SideBar

    项目中要求列表按照ABCD这种字母排序检索的功能,看了大神写的,瞬间崇拜了,接下来借大家参考参考了 首先是自定义view sidebar /** * @author J *一个自定义view 实现a- ...