WPF Application 类介绍以及WPF异常处理

现在把wpf中的application和特殊的异常处理办法公布如下:

wpf中对启动窗体等的控制 是APP.XAML文件和其cs文件下面,可以在XAML中进行编码,也可以在后台cs代码中编码

首先讲解Application类

属性:

    Current                  获取当前 AppDomain的 Application 对象

    MainWindow           获取或设置应用程序的主窗体。(下面详细介绍)

    Resources              获取或设置应用程序范围资源的集合,例如样式和画笔。

    ShutdownMode       获取或设置会导致Shutdown方法调用的情况。

    StartupUri       获取或设置自动显示的UI,当应用程序启动时。

    Windows      获取在应用程序中实例化窗口。

如果 Application 对象的 ShutdownMode 属性设置为 OnMainWindowClose,关闭主窗口导致应用程序关闭。

在应用程序启动过程,下面的示例演示如何实例化代码中的 MainWindow

public partial class App : Application
{
    void App_Startup(object sender, StartupEventArgs e)
    {
        MainWindow window = new MainWindow();
        window.Show();
    }
}

  WPF程序中,对于异常的捕获一般使用try/catch块。就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获。如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失。WPF中提供了Application.DispatcherUnhandledException事件和AppDomain.UnhandledException事件,通过注册这两个事件,我们可以对未经处理的全局异常集中执行自定义处理。

  对于在主UI线程上运行的代码未处理的每个异常,Application都将引发一个 DispatcherUnhandledException。当您处理一个来自 DispatcherUnhandledException 的未经处理的异常,并且不希望 WPF 继续处理该异常时,需要将 Handled 属性设置为 true。通俗的讲,如果不希望应用程序崩溃,我们需要将Handled 属性设置为 true。但不是所有的异常都可恢复,如果异常是FileNotFoundException,程序可以在处理异常后继续运行,如果异常是StackOverflowException,则无法再继续运行,即将关闭。

  对于在任何线程中的任何未处理的异常,以及无论什么应用程序域中的异常都将引发UnhandledException。如果UI线程中的异常未处理,也会引发UnhandledException。从.NET Framework 4开始,损坏进程状态异常将不引发该事件,如堆栈溢出,或者是访问冲突。因为默认情况下,公共语言运行时 (CLR) 并不把这些异常输出到托管代码,且不为它们调用 try/catch 块。

  奉上简单代码:

 1      /// <summary>
 2         /// 应用程序启动
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void Application_Startup(object sender, StartupEventArgs e)
 7         {
 8             Current.DispatcherUnhandledException += App_OnDispatcherUnhandledException;
 9             AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
10         }
11
12         /// <summary>
13         /// UI线程抛出全局异常事件处理
14         /// </summary>
15         /// <param name="sender"></param>
16         /// <param name="e"></param>
17         private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
18         {
19             try
20             {
21                 LogHelper.Instance.Logger.Error(e.Exception, "UI线程全局异常");
22                 e.Handled = true;
23             }
24             catch (Exception ex)
25             {
26                 LogHelper.Instance.Logger.Error(ex, "不可恢复的UI线程全局异常");
27                 MessageBox.Show("应用程序发生不可恢复的异常,将要退出!");
28             }
29         }
30
31         /// <summary>
32         /// 非UI线程抛出全局异常事件处理
33         /// </summary>
34         /// <param name="sender"></param>
35         /// <param name="e"></param>
36         private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
37         {
38             try
39             {
40                 var exception = e.ExceptionObject as Exception;
41                 if (exception != null)
42                 {
43                     LogHelper.Instance.Logger.Error(exception, "非UI线程全局异常");
44                 }
45             }
46             catch (Exception ex)
47             {
48                 LogHelper.Instance.Logger.Error(ex, "不可恢复的非UI线程全局异常");
49                 MessageBox.Show("应用程序发生不可恢复的异常,将要退出!");
50             }
51         }

时间: 2024-10-12 22:32:46

WPF Application 类介绍以及WPF异常处理的相关文章

博客园WPF Application类

所有的WPF程序,都是由Application类实例创建,该类负责打开当前应用程序和窗体,并且决定如何关闭应用程序等.Application类的主要功能可以简单总结以下几点: 1.保持主线程 使用Application后,只要有窗体没有退出,则应用程序不会退出,他会重新定义出新的主窗体,只有所有的窗体都关闭,Appliction才决定是否退出应用程序.Application起到管理所有窗体的作用.看如下代码: class Program { [STAThread()] static void M

Wpf Application类的任务:

首先Application能够实现几种功能,比如访问命令行参数,获取当前程序类的实例,以及常见的单窗口程序实例. 访问命令行参数: 第一种: 获取获取方式使用Environment.GetCommandLineArgs(); 第二种: 响应 Application 类的 OnStartup() 事件. Example: /// <summary> /// 通过类属性=>调试=>命令行参数执行相应的动作 /// </summary> /// <param name=

【WPF学习】第二十六章 Application类——应用程序的生命周期

原文:[WPF学习]第二十六章 Application类--应用程序的生命周期 在WPF中,应用程序会经历简单的生命周期.在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件.最后,当释放应用程序对象时,应用程序将结束. 一.创建Application对象 使用Application类的最简单方式是手动创建它.下面的示例演示了最小的程序:在应用程序入口(Main()方法)处创建名为MainWindow的窗口,并启动一个新的应用程序: 在本质

六,WPF的Application类

Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Application提供了为数不多的几个非常有用的事件,如下图所示: 有两种选择用于处理事件:在XAML中使用事件特性的方式关联事件处理程序,或重写相应的受保护方法,当重写应用程序方法时,推荐首先调用基类的实现,通常,基类的实现只是引发相应的应用程序事件. 初始界面(SplashScreen) WPF

WPF中的Application类。

原文:WPF中的Application类. Application对象用的名称空间是system.windows 1.手动创建Application对象步骤. 1.1).把项目中的App.Xaml文件从项目中排除. 1.2).新建Startup类. 1.3).在类中声明静态的.无返回值的Main方法. 1.4).在方法中创建application对象和窗口对象. public class Startup { [STAThread] //指定应用程序的 COM 线程模式是单线程单元(STA) st

浅析C#(WPF)中的Application类

Application类 封装WFP应用程序. 命名空间:System.Windows 语法:public class Application : DispatcherObject, IQueryAmbient 可以看到Application继承了DispatcherObject类和IQueryAmbient接口. 首先看一下DispatcherObject类 DispatcherObject类 表示与Dispatcher关联的对象 命名空间:System.Windows.Threading 语

简单的介绍下WPF中的MVVM框架

最近在研究学习Swift,苹果希望它迅速取代复杂的Objective-C开发,引发了一大堆热潮去学它,放眼望去各个培训机构都已打着Swift开发0基础快速上手的招牌了.不过我觉得,等同于无C++基础上手学习C#一样,即使将来OC被淘汰,那也是N年之后的事情,如果真的要做IOS开发,趁现在Swift才刚开始,花那么几个月去了解一下OC绝对是一件有帮助的事情. 扯远了,我前几天刚接触到一个叫做mvvm的框架,发现很有意思,带着学习的态度来写点东西,不足之处一起研究.还有一个很重要的原因,我发现不少同

每天翻译一点点: WPF Application Framework (WAF)

ps:http://waf.codeplex.com/wikipage?title=Model-View-ViewModel%20Pattern&referringTitle=Documentation Model-View-ViewModel Pattern Common abbreviations: M-V-VM or MVVM Introduction Separating user interface code from everything else is a key principl

WPF备忘录(7)WPF图片资源路径介绍

原文:WPF备忘录(7)WPF图片资源路径介绍 在项目中增加两张图片Content.jpg和Resource.jpg,分别将其生成操作属性设置为Content和Resource.     在界面中增加两个Image控件ImgContent和ImgResource,在XAML中分别设置Source路径为Content.jpg和Resource.jpg.运行后ImgResource能正常显示图片,但是ImgContent控件无显示.将Content.jpg图片拷贝至应用程序的Debug目录中,Img