当使用 Silverlight 的托管 API 创建应用程序时,必须创建一个从 Application 派生的类。Application 类提供应用程序通常要求的若干服务。它主要表示应用程序代码在 Silverlight 插件生命周期中的入口点。
Silverlight 插件生命周期自用户导航到承载 Silverlight 插件的网页时开始。如果用户已安装了 Silverlight,则 Web 浏览器激活此插件并开始下载应用程序包。
插件加载 Silverlight 核心服务,然后加载 Silverlight 公共语言运行时 (CLR),后者将为应用程序创建 AppDomain。当应用程序包下载完成时,CLR 实例化您的 Application 类并引发其 Startup 事件。
您可以向应用程序类构造函数中添加代码。然而,您通常将 Startup 事件处理程序用于大多数应用程序初始化任务,如显示用户界面页。
下图演示插件激活过程和此过程中各组件之间的关系。
有关 Silverlight 核心服务和 CLR 的更多信息,请参见 Silverlight 结构。有关 Silverlight 应用程序包的更多信息,请参见应用程序结构。
基于 Silverlight 的应用程序中可能只有一个 Application 实例。启动后,Application 实例提供应用程序通常要求的若干服务。您可以通过从 static Application..::.Current 属性中检索 Application 实例,从应用程序中的任何代码访问这些服务。
本主题介绍 Application 类的以下功能。
- 应用程序生存期管理。
- 应用程序资源文件加载。
- 未经处理的异常处理。
- Web 宿主集成。
- 扩展性。
应用程序生存期管理
您可以在应用程序生存期的以下各点向运行的应用程序类添加代码:
- 应用程序类构造函数。
- 应用程序启动事件。
- 应用程序退出事件。
应用程序类构造
您可以向应用程序类构造函数添加代码,以执行基本初始化任务,例如,初始化应用程序变量和附加事件处理程序。
大多数应用程序类是使用 XAML 标记和代码隐藏文件定义的。应用程序类的构造函数通常包括对于 InitializeComponent 方法的调用,该方法负责合并 XAML 和代码隐藏文件。构建过程将生成 InitializeComponent 方法实现,此实现通过调用 Application..::.LoadComponent 方法来加载 XAML。
应用程序 XAML 可以指定应用程序事件处理程序并使用属性和样式填充 Application..::.Resources 字典,以供整个应用程序使用。有关更多信息,请参见资源字典。
应用程序启动
当 Silverlight 插件已完成加载应用程序包时,将发生 Application..::.Startup 事件。此时,所有包内程序集已加载到应用程序域中并可供使用。
可以使用 Startup 事件来执行常见的初始化任务,如下所示:
- 处理在启动时检索的数据(如初始化和 URL 参数)或在前一个应用程序会话中存储的数据。
- 显示应用程序用户界面 (UI)。
- 开始异步下载其他资源文件或程序集。
以下各节简要介绍如何完成这些任务并提供指向更多信息的链接。
处理启动数据
若要检索在 Silverlight 插件配置中指定的初始化参数,请使用 StartupEventArgs..::.InitParams 属性。有关更多信息,请参见如何:指定和检索自定义初始化参数。
若要从宿主网页检索 URL 参数,请使用 HtmlDocument..::.QueryString 属性。可以从 static HtmlPage..::.Document 属性检索 HtmlDocument 对象。但请注意,如果禁用了 HTML 访问,则无法使用 Document 属性。当网页承载来自不同域的基于 Silverlight 的应用程序时,这通常是这种情况。有关更多信息,请参见 HTML 桥中的安全设置。
若要从前一个应用程序会话中检索数据,请使用 IsolatedStorageSettings 类。有关更多信息,请参见如何使用独立存储存储和检索应用程序设置。
若要使启动数据可用于整个应用程序,则将其添加到 Application..::.Resources 字典。
显示用户界面
若要显示应用程序用户界面,请在 Startup 事件处理程序中设置 RootVisual 属性。
您只能设置此属性一次,通常是针对为用户界面提供布局根的 UserControl。可以通过更改可视化元素根的布局根在启动后更改用户界面。有关更多信息,请参见导航概述。
说明:
Startup 事件可能在宿主网页完成布局计算之前发生。如果您将相对缩放用于 Silverlight 插件,则 Content..::.ActualHeight 和 ActualWidth 值在应用程序启动时没有意义。若要根据插件的当前大小缩放用户界面或执行布局,必须处理 Content..::.Resized 事件。有关更多信息,请参见调整 Silverlight 插件大小。
检索其他资源
若要以异步方式下载其他资源文件或程序集,请使用 WebClient 类。
如果文件为 zip 文件,则可以使用 Application..::.GetResourceStream(StreamResourceInfo, Uri) 方法在下载后解压缩其内容。有关更多信息,请参见按需下载内容。
如果文件为程序集,则可以通过创建一个新的 AssemblyPart 对象并调用其 Load 方法将程序集加载到应用程序的 AppDomain 中。有关更多信息,请参见如何按需加载程序集。
应用程序退出
当发生以下操作之一时,将发生 Application..::.Exit 事件:
- 用户关闭承载 Silverlight 插件的网页。
- 用户刷新宿主网页。
- 用户将浏览器导航出宿主网页。
- 宿主网页使用 JavaScript 和 HTML DOM 从页中删除插件。
- 用户注销或关闭操作系统。
Application..::.Exit 事件的一个常见用途是使用 IsolatedStorageSettings 类来保存应用程序设置。有关更多信息,请参见如何使用独立存储存储和检索应用程序设置。
应用程序资源文件加载
Silverlight 为从应用程序程序集、库程序集、应用程序包和主机服务器加载资源文件提供了广泛的支持。这种支持取决于您如何配置资源文件、您将它们部署在何处以及如何加载它们。有关更多信息,请参见资源文件和应用程序结构。
若要以编程方式访问原始资源文件,请使用 Application..::.GetResourceStream 方法。此方法提供重载,以使您能够从应用程序包或您按需检索的 zip 文件中解压缩资源文件。有关更多信息,请参见按需下载内容和如何按需加载程序集。
未经处理的异常处理
在应用程序的生存期中,可能会发生意外情况,而导致 Silverlight 插件引发异常。尽管您可以在应用程序代码中捕获异常,但您可能无法预期所有潜在的异常。
未经处理的异常将导致 Silverlight 插件停止在浏览器中运行。为了防止发生这一情况,请处理 Application..::.UnhandledException 事件。可以用事件数据来确定异常是否可恢复。如果可以从异常中恢复,则将 ApplicationUnhandledExceptionEventArgs..::.Handled 属性设置为 true。
如果您不在托管代码中处理异常,则将发生 Silverlight 插件 onError 事件。这向您提供最后一个机会,供您通过在宿主网页中使用 JavaScript 来处理此异常。onError 事件提供对插件错误代码的访问,这对于进行调试可能很有用。有关更多信息,请参见调试、错误处理和异常。有关错误代码信息,请参见 Silverlight Plug-in Error Messages(Silverlight 插件错误消息)。
宿主集成
托管代码直接与承载它的 Silverlight 插件交互有时很有用。例如,您可能希望检索初始插件配置值,或使用户能够在全屏模式下显示插件。
若要检索表示当前宿主插件的对象,请使用 Application..::.Host 属性。此属性范围 SilverlightHost 的一个实例,它提供与 Silverlight 插件对象参考中介绍的功能类似的功能。
扩展性
借助于应用程序扩展服务,您可以通过填充其 ApplicationLifetimeObjects 属性将更多服务添加到 Application 实例。此扩展性机制优于使用 Application 类的框架特定的子类。借助于应用程序扩展服务,可以与应用程序生存期事件进行深入集成,并可以轻松地同时使用多个扩展。有关更多信息,请参见应用程序扩展服务。
请参见