代码改变世界

WPF Summary:Application生存期

2011-03-23 18:20  海蓓娜楽  阅读(301)  评论(0编辑  收藏  举报

WPF 应用程序生存期由 Application 所引发的几个事件来标记,这些事件告诉您应用程序何时启动、何时激活和停用以及何时关闭。

WPF 独立应用程序生存期的关键事件 WPF XAML浏览器承载的应用程序生存期的关键事件

初始屏幕:当应用程序启动时,您可以指定要在启动窗口中使用的图像或“初始屏幕”。通过使用 SplashScreen 类,可以在应用程序加载时轻松地显示启动窗口。调用 Run 之前将创建和显示 SplashScreen 窗口。

启动应用程序:在调用 Run 并且初始化应用程序之后,就可以运行应用程序了。此时触发 Startup 事件(所要做的最常见的一件事情是显示 UI)。

显示用户界面:大多数独立 Windows 应用程序在开始运行时会打开一个 Window。可以在 Startup 事件处理程序中new 一个窗口,还可以通过设置StartupUri的方式打开一个窗口。默认情况下,在独立应用程序中实例化的第一个 Window成为主应用程序窗口。此 Window对象由 Application.MainWindow 属性引用。如果要使用与实例化的第一个 Window 不同的窗口作为主窗口,可以使用编程方式更改 MainWindow 属性的值。

处理命令行参数:在应用程序初始化过程中,WPF 从操作系统检索命令行参数,然后通过 StartupEventArgs 参数的 Args 属性将这些命令行参数传递到 Startup 事件处理程序。XBAP 无法检索和处理命令行参数,因为它们是使用 ClickOnce 部署启动的。但是,这些应用程序可以通过用于启动它们的 URL 来获取和处理查询字符串形参。

激活与停用应用程序:用户使用 Windows 可以在应用程序之间进行切换。 最常用的方法是使用 Alt+Tab 组合键。仅当应用程序具有用户可选择的可见的 Window 时,才能切换到该应用程序。当前所选的 Window 是“活动窗口”(也称为“前台窗口”),并且是接收用户输入的 Window。 具有活动窗口的应用程序是“活动应用程序”(或“前台应用程序”)。 在下列情况下,应用程序将成为活动应用程序:

Ø 应用程序启动并显示一个 Window;

Ø 用户通过在应用程序中选择一个 Window 从另一个应用程序切换过来。

可以通过处理 Application.Activated 事件来检测应用程序何时成为活动应用程序。

与此类似,在下列情况下,应用程序成为非活动应用程序:

Ø 用户从当前应用程序切换到另一个应用程序;

Ø 应用程序关闭。

可以通过处理 Application.Deactivated 事件来检测应用程序何时成为非活动应用程序。

应用程序关闭:应用程序关闭时,其生存期就结束了。应用程序可能由于下列原因而关闭:

用户关闭了所有 Window;

Ø 用户关闭了主 Window;

Ø 用户通过注销或关闭来终止 Windows 会话;

Ø 满足特定于应用程序的条件。

关闭模式:大多数应用程序在所有窗口关闭或主窗口关闭时都会关闭。但有时其他特定于应用程序的条件可能决定应用程序何时关闭。可以通过使用以下 ShutdownMode 枚举值之一设置 ShutdownMode 来指定应用程序关闭的条件:

Ø OnLastWindowClose

Ø OnMainWindowClose

Ø OnExplicitShutdown

ShutdownMode 的默认值为 OnLastWindowClose,该值表示应用程序将在用户关闭应用程序中的最后一个窗口时自动关闭。但是,如果应用程序应当在主窗口关闭时关闭,并且您将 ShutdownMode 设置为 OnMainWindowClose,那么 WPF 会自动关闭。

如果您具有特定于应用程序的关闭条件,请将 ShutdownMode 设置为 OnExplicitShutdown。在这种情况下,您应当通过显式调用 Shutdown 方法来关闭应用程序;否则,即使所有窗口都已关闭,应用程序仍将继续运行。请注意,当 ShutdownMode 为 OnLastWindowClose 或 OnMainWindowClose 时,将会隐式调用 Shutdown。

会话终止:ShutdownMode 属性所描述的关闭条件是特定于应用程序的。但在某些情况下,应用程序可能会由于外部条件而关闭。最常见的外部条件出现在用户通过以下操作终止 Windows 会话时:注销、关机、重新启动、休眠。若要检测 Windows 会话的终止时间,可以处理 SessionEnding事件。SessionEnding不会对 XBAP 引发。

Exit:当应用程序关闭时,它可能需要执行一些最终处理,例如保存应用程序状态。

未处理的异常:有时,应用程序可能在非正常条件下关闭,例如当引发意外的异常时。在此情况下,应用程序可能没有代码来检测和处理异常。这种类型的异常是未经处理的异常;在应用程序关闭之前,将显示一个如下图所示的通知。

WPF DispatcherUnhandledException

从用户体验的角度来说,应用程序最好通过执行以下部分或全部操作来避免这一默认行为:

Ø显示用户友好的信息;

Ø尝试使应用程序继续运行;

Ø在 Windows 事件日志中以开发人员易于理解的方式详细记录异常信息。

实现此支持的前提是能够检测到未经处理的异常(对于该异常将引发 DispatcherUnhandledException事件)。