在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。

  本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。

  在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。

  前文:<1-7>, <-14>,<15-21>,<22-27>, <28-33>

  [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂cnblogs.com/xfuture]


  #34 WPF程序退出事件处理

  当WPF程序点击关闭或者退出时,你可以在Application.Exit事件里添加处理退出逻辑

  

<Application x:Class="WpfApplication4.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
Exit="Application_Exit">
</Application> private void Application_Exit(object sender, ExitEventArgs e)
{
// Perform tasks at application exit
}

  Exit事件会在应用退出和Windows退出时触发,顺序在Windows的SessionEnding事件后面。

  

  #35 Unhandled Exceptions

  WPF应用程序当遇到异常Exception时,如果代码中并没有对其进行处理就会抛出,导致了应用程序异常关闭。类似下图:

  

  异常抛出时,WPF应用会立刻关闭。用户会丢失所有的操作和得不到多余的信息。其实就是程序员最不愿意碰到的情况,自己写的程序崩掉了。

  处理方法是你可以在Application.DispatcherUnhandledException中处理所有抛出的异常。在这里我们可以将异常信息展示出来而且通过设置Handled属性来阻止程序崩溃。如下图:

  

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
string friendlyMsg = string.Format("SO sorry that something went wrong. The error was: [{0}]", e.Exception.Message);
string caption = "Error";
MessageBox.Show(friendlyMsg, caption, MessageBoxButton.OK, MessageBoxImage.Error); // Signal that we handled things--prevents Application from exiting
e.Handled = true;
}

  

  

  #36 Application-Scoped Properties

  

  Application类包含了一个Properties的属性,它是属性集合的字典 IDictionary,存储Key/Value。你可是存储在Application要用到的所有属性在这个字典里。

  在任何线程都可以读写Properties,它是线程安全的。

  

private void Application_Startup(object sender, StartupEventArgs e)
{
this.Properties.Add("Debug", false);
this.Properties.Add("Logger", null); // Set properties based on command line parameters
foreach (string a in e.Args)
{
if (a.ToLower() == "/debug")
this.Properties["Debug"] = true;
else if (a.ToLower() == "/logging")
this.Properties["Logger"] = new MyAppLogger("Logfile.txt");
}
}

  

 #37 Resource

  WPF和Silverlight,Resource是指可以在多处使用的.net对象或者值。Resource是WPF和Silverlight可以重用的资源。

  Resources存储在应用程序的资源字典的,存储的对象是Key/Value的形式。资源通常储存的对象有:styles, templates, brushes and colors, storyboards, transforms, or 3D matrices

  

  #38 定义和使用Resource

  你可以将Resource和MainApplication关联起来,这样你就可以在任何地方使用该资源。

  你可以在App.xaml里定义资源:

  

<Application x:Class="WpfApplication.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml" Startup="Application_Startup" >
<Application.Resources>
<SolidColorBrush x:Key="greenBrush" Color="Green"/>
</Application.Resources>
</Application>

  在任意的UserControl或者Window都可以通过引用StaticResource来引用这个resource。

  

<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="224" Width="334">
<Grid>
<Button Content="Button" Background="{StaticResource greenBrush}"
Height="23" HorizontalAlignment="Left" Margin="60,57,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>

  

  #39 c# code使用resource

  Resource Dictionary存储的key/value形式的对象是DictionaryEntry类型的。你可以在Xaml中定义这个资源并且在C# code中来使用。

  具体实现如下:

  

<Application.Resources>
<SolidColorBrush x:Key="greenBrush" Color="Green"/>
</Application.Resources>

  Key是greenBrush Value是一个SolidColorBrush, Color属性是Green。

  C# code中得到该resource:

  

SolidColorBrush br = (SolidColorBrush)Application.Current.Resources["greenBrush"];

  后篇会对WPF内部机制继续做探索,敬请关注!

  如果觉得有帮助,右下角赞一下吧~ (* *)

2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  2. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  3. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>

    前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...

  8. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

随机推荐

  1. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  2. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  3. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  4. ThinkPHP 模板substr的截取字符串函数

    ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...

  5. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  6. ResponsibleChain(责任链模式)

    /** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...

  7. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  8. can't run roscore 并且 sudo 指令返回 unable to resolve host

    I'm using ubuntu14 LTS. Problems: 1. When run roscore, got a mistake and an advice to ping the local ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  10. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...