对象生存期事件

本主题介绍表示对象生存期(创建、使用和销毁)中的阶段的特定 WPF 事件。

先决条件

本主题假设你作为 Windows Presentation Foundation (WPF) 类上现有依赖项属性的使用者已经对依赖项属性有所了解,并且已阅读了依赖项属性概述主题。 为了能理解本主题中的示例,你还应了解 XAML(请参阅 WPF 中的 XAML)并知道如何编写 WPF 应用程序。

对象生存期事件

Microsoft .NET Framework 托管代码中的所有对象都要经历类似的一系列生命阶段,即创建、使用和销毁。 许多对象还包括生命终止阶段,该阶段属于销毁阶段的一部分。 WPF 对象(更明确的说,WPF 标识为元素的视觉对象)还具有对象生命的一系列常见阶段。 WPF 编程和应用程序模型将这些阶段作为一系列事件公开。 WPF 中有四种与生存期事件有关的主要类型对象 - 即常规元素、窗口元素、导航宿主和应用程序对象。 窗口和导航宿主也都属于视觉对象(元素)这个较大的组。 本主题首先介绍所有元素的通用生存期事件,然后介绍应用于应用程序定义、窗口或导航宿主的更具针对性的生存期事件。

元素通用生存期事件

任何 WPF 框架级元素(从 FrameworkElementFrameworkContentElement 派生的那些对象)都具有三个常见的生命周期事件:InitializedLoadedUnloaded

已初始化

首先引发 Initialized,它大致对应于通过调用其构造函数进行的对象初始化。 由于事件为响应初始化而发生,因此可以确保对象的所有属性均已设置。 (动态资源或绑定等表达式用法除外;这些是不进行计算的表达式。)由于需要设置所有属性,在标记中定义的嵌套元素引发的 Initialized 的顺序是,首先是元素树中最深层的元素,然后是朝向根的父元素。 采用此顺序是鉴于父子关系和包容均为属性,因此在填充属性的子元素完全初始化前,父元素无法报告初始化。

编写处理程序以响应 Initialized 事件时,必须考虑到无法保证元素树(逻辑树或可视化树)中附加处理程序周围的所有其他元素(尤其是父元素)均已创建。 成员变量可能为 null,或者基础绑定还未填充数据源(即使在表达式级别)。

已加载

接下来将引发 Loaded。 在最终呈现之前且在布局系统已计算呈现所需的所有值后,将引发 Loaded 事件。 Loaded 要求包含元素的逻辑树是完整的,并连接到提供 HWND 和呈现图面的演示源。 标准数据绑定(绑定到本地源,例如其他属性或直接定义的数据源)将在 Loaded 之前发生。 可能已发生异步数据绑定(外部或动态源),但是根据其异步特性的定义不能保证已发生异步数据绑定。

引发 Loaded 事件的机制不同于 Initialized。 将以逐个元素的方式引发 Initialized 事件,无需通过整个元素树直接协调。 相反,引发 Loaded 事件是通过整个元素树(具体而言是逻辑树)协调的结果。 当树中所有元素都处于被视为已加载的状态时,将首先在根元素上引发 Loaded 事件。 然后在每个子元素上连续引发 Loaded 事件。

注意

这种行为看起来可能类似于路由事件的隧道。 但是,未将任何信息在事件之间传送。 每个元素始终有机会处理其 Loaded 事件,并且将事件数据标记为已处理仅影响该元素。

已卸载

最后引发 Unloaded,并由演示源或要删除的可视化父级启动。 当引发 Unloaded 并对其进行处理后,作为事件源父级(由 Parent 属性确定)的元素或逻辑树或可视树中上游的任何给定元素可能已移位,因此可能无法将数据绑定、资源引用和样式设置为其常规的或最后已知的运行时值。

生存期事件应用程序模型元素

基于元素的常见生存期事件构建了以下应用程序模型元素:ApplicationWindowPageNavigationWindowFrame。 这些与特定用途相关的额外事件扩充了常见的生存期事件。 将在以下位置详细介绍这些内容:

另请参阅