每个运行的WPF应用程序都由System.Windows.Application类的一个实例表示。该类跟踪应用程序中打开的所有窗口,决定何时关闭应用程序,以及引发开发人员需要处理的应用程序事件,一执行初始化和清理工作。
1. 应用程序生命周期
1.1创建Application类对象
Application对象可以手动创建,Application类提供了Run方法传递一个窗口的参数,这个窗口就被设置为主窗口,并且可以通过public Window MainWindow { get; set; }Application的MainWindow属性在应用程序中访问这个窗口。Run()
方法回引发public event StartupEventHandler Startup;并显示主窗口。
1.2派生一个自定义的Application类
当在Visual Studio中创建WPF应用程序的时候,Visual Studio从Application类派生一个自定义类,在简单的应用程序中,这种方法没什么意义。但是需要处理应用程序事件,那么他提供了一个更简洁的模型,因为可以在派生自Application的中放置所有的事件处理程序。
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
Class的特性:创建一个派生自元素的类。上面的Class创建了一个派生自Application的类。该类名为App。
Application标签不仅创建了一个自定义应用程序的类,而且甚至StartupUri属性,
指示代表主窗口的XAML文档。不需要使用代码显示的实例化这个窗口-XAML解析器将为你完成者个工作。在obj/Debug文件夹下中得App.g.cs文件,这儿给出了创建XAML模板自动生成的代码。
1.3应用程序的关闭方式
通常只要有一个窗口还没关闭Application类就保持应用程序处于有效状态。当调用应用程序ShutDown()方法时,应用程序并没有立即停止运行,
会导致Application.Run()方法会立即返回,但是仍然可以运行Main方法中得其他代码或者处理Application.Exit事件。
Application类提供了几个常有用的几个事件。其余的几个事件用于导航应用程序。
应用程序事件
(1)public delegate void StartupEventHandler(object sender, StartupEventArgs e);
public event StartupEventHandler Startup;
该事件时调用Run()方法之后,并且在主窗口显示之前发生的。可以通过这个事件检查所有的命令行参数,命令行参数是通过StartupEventArgs. Args属性获取的。
(2)public event ExitEventHandler Exit;
该事件时在应用程序关闭时,Run()方法即将返回之前发生的,
(3)public event SessionEndingCancelEventHandler SessionEnding;
该事件在Window对话结束时发生。
(4) public event EventHandler Activated;
当应用程序的一个窗口被激活时发生,当从另外一个窗口切换到这个应用程序时,回发生改事件,在第一次显示一个窗口时也会发生该事件。
(5) public event EventHandler Deactivated;
当应用程序中得一个窗口被取消激活时发生该事件,当切换到另外一个窗口应用程序时回发生该事件。
(6) public event DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException;
在应用程序的任何一个位置只要发生一个未处理的异常,就会发生该事件。通过这种件事可以记录关键性的错误,甚至可以选择不处理这些异常,并可以将
DispatcherUnhandledExceptionEventArgs.Handle属性设置为true继续运行应用程序。只有当可以确定应用程序仍处于合法状态并且可以继续运行的时候才可以这么做。
1.4应用程序事件
- Application类的任务
2.1处理命令行参数
2.2访问当前Application对象
通过在应用程序中调用Application.Current属性,可以在程序的任何位置来获取当前应用程序的实例,并进行窗口之间的基本交互,因为任何窗口都可以访问当前的Application对象,并且通过Application对象可以获得主窗口的引用。
Window win=Application.Current.MainWindow;
在一个窗口中还可以检查Application.Windows集合,这个集合提供了当前所有打开的window窗体的引用。
Foreach(Window win in Application.Current.Windows)
{
。。。。
}
注意:当现实窗口时,窗口被添加到了Windows集合中,而当关闭窗口时会从windows集合中移除该窗口。因此窗口在集合中得位置可以改变,所以不能假定在一个特定的位置能找到一个特定的窗口。