声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。
本文链接:http://blog.csdn.net/li_007/archive/2010/11/04/5987896.aspx
开拓进取的小乌龟------->CSDN点滴点点滴滴Blog
一个WPF应用程序必须有一个Application对象实例或者它的子类实例,它代表了WPF的一个windows进程,它提供了WPF程序的生命周期,并且集成了ClickOnce部署功能。或者更明确地说,在WPF中应用程序就是System.Windows命名空间下Application类或者它的子类的一个实例。
Application 是一个类,其中封装了 WPF 应用程序特有的功能,包括:
-
应用程序生存期:Activated、Current、Deactivated、DispatcherUnhandledException、Exit、Run、SessionEnding、Shutdown、ShutdownMode、Startup。
-
应用程序范围的窗口、属性和资源管理:FindResource、GetContentStream、GetResourceStream、LoadComponent、MainWindow、Properties、Resources、StartupUri、Windows。
-
命令行参数和退出代码处理:Application.Startup、Application.Exit、Application.Shutdown。
-
导航:FragmentNavigation、LoadCompleted、Navigated、Navigating、NavigationProgress、NavigationStopped、NavigationFailed、SetCookie、GetCookie。
Application 实现单一实例模式以提供对其窗口、属性和资源范围服务的共享访问。因此,对于每个 AppDomain,只能创建 Application 类的一个实例。可以使用标记、标记与代码隐藏或代码来实现 Application。如果 Application 是使用标记实现的(无论是标记还是标记与代码隐藏),则标记文件都必须配置为一个 Microsoft Build Engine (MSBuild) ApplicationDefinition 项。
看下面一个最简单的WPF实例代码,如下:
在这里要注意的是,一定不要忘了再Main函数前面加上[STAThread],不然能编译通过,但是运行会出错的。
[STATHread]:单线程套间(Single Threaded Apartment,STA)作为非托管组件对象模型(COM)的一部分,是用来管理COM间的调用。由于很多COM应用在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,这样就会导致不可预知的后果。而MS的所有表现层框架,托管的以及非托管的
,都以必须运行在初始化后的STA线程中。
好了,下面说一下由.xaml文件和.xmal.cs文件(code-behind)经过Partial关键字编译连接起来的完整application类或者子类。
首先是.xaml文件
下面是.xaml.cs文件
当编译器遇到了partial关键字之后,会将.xaml和.xaml.cs文件组合编译连接成一个完整的app类(Application的子类)。在程序启动运行过程中,会出现一下步骤:
1、创建一个Application类对象(其实是子类对象),并设置它的Application.Current属性。
2、根据StartupUri属性指定的XAML文件,创建并显示UI。
3、设置Application类对象(其实是Application的子类对象)的MainWindows属性。
4、调用Application类对象(其实是Application的子类对象)的Run方法,并保持Application的运行,直到关闭主窗口。
补充两点:
a、也可以通过响应Startup事件创建并显示一个UI。代码截图照片如下:
b、通过将XAML文件的Build Action属性设置为ApplicationDefinition,改变Application类和Main函数的定义文件。
Application事件介绍,事件是Application重要的组成部分,也是COM4编程语言的基础。可以将标准的Application的生命循环看成是一组事件的组合。总最开始的Startup,到最后的Exit。
名称 | 说明 | |
---|---|---|
![]() | Activated | 当应用程序成为前台应用程序时发生。 |
![]() | Deactivated | 当应用程序停止作为前台应用程序时发生。 |
![]() | DispatcherUnhandledException | 在异常由应用程序引发但未进行处理时发生。 |
![]() | Exit | 恰好在应用程序关闭之前发生,且无法取消。 |
![]() | ||
![]() | LoadCompleted | 在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生。 |
![]() | SessionEnding | 在用户通过注销或关闭操作系统而结束 Windows 会话时发生。 |
![]() | Startup | 在调用 Application 对象的 Run 方法时发生。 |
结合一个实例来说明这些事件发生的顺便过程:
app.xaml
app.xmal.cs
运行结果截图如下:
结果分析:
1、Run触发Startup事件
2、窗口呈现获得焦点触发 Activated事件
3、我让窗口失去焦点触发Deactivated事件,但在Deactivated事件处理函数中自动抛出了一个没有被处理的异常,
从而触发DispatcherUnhandledException事件
4、再次让窗口获得焦点触发Activated事件
5、关闭窗口,引发窗口失去焦点触发Deactivated事件,从而抛出未作处理的异常,触发DispatcherUnhandledException事件
6、程序退出,触发Exit事件。程序结束生命期。
好了,关于Application的其他服务,如ClickOnce,可以去查询MSDN,再次不做说明。