对象生存期事件
本主题介绍表示对象生存期(创造、使用和析构)中的阶段的特定 WPF 事件。
本主题包括下列各节。
- 先决条件
- 对象生存期事件
- 元素通用生存期事件
- 生存期事件应用程序模型元素
- 相关主题
先决条件
本主题假定您从 Windows Presentation Foundation (WPF) 类的现有依赖项属性的使用者角度了解依赖项属性,并且已阅读依赖项属性概述主题。 若要采用本主题中的示例,还应当了解Extensible Application Markup Language (XAML)(请参见 XAML 概述 (WPF))并知道如何编写 WPF 应用程序。
对象生存期事件
Microsoft .NET Framework 托管代码中的所有对象都要经历类似的一系列的生命阶段,即创造、使用和析构。 许多对象还包括生命终止阶段,该阶段属于析构阶段的一部分。 WPF 对象,更具体而言,WPF 标识为元素的 Visual 对象,还具有对象生命的一系列通用阶段。 WPF 编程和应用程序模型将这些阶段公开为一系列的事件。 在 WPF 中有四种与生存期事件有关的主要类型的对象;即常规元素、窗口元素、导航宿主和应用程序对象。 Windows 和导航宿主也都属于 Visual 对象(元素)这个较大的分组。 本主题先介绍对所有元素都通用的生存期事件,然后介绍应用于应用程序定义、窗口和导航宿主的更具体的生存期事件。
元素通用生存期事件
任何 WPF 框架级元素(从 FrameworkElement 或 FrameworkContentElement 派生的那些对象)都有三种通用的生存期事件:Initialized、Loaded 和 Unloaded。
Initialized
首先引发 Initialized,大致对应于由对其构造函数的调用执行的对象的初始化。 由于事件发生是为响应初始化,因此可以保证对象的所有属性均已设置。 (诸如动态资源或绑定等表达式用法是个例外;这些将是不进行计算的表达式。)需要设置所有属性的结果是,在标记中定义的嵌套元素引发的 Initialized 的序列将开始发生,其顺序是先是元素树中最深层的元素,然后是朝向根的父元素。 此顺序的原因是父子关系和包容均为属性,因此直到填充该属性的子元素也完全初始化时,父级才能报告初始化。
当编写处理程序以响应 Initialized 事件时,必须考虑无法保证元素树(逻辑树或可视化树)中处理程序所附加元素周围的所有其他元素(尤其是父元素)均已创建的情况。 成员变量可能为 null,或者基础绑定还未填充数据源(即使在表达式级别)。
Loaded
随后将引发 Loaded。 在最终呈现之前,但是在布局系统已计算所有用于呈现所必需的值后,引发 Loaded 事件。 Loaded 要求包含元素的逻辑树是完整的,并连接到提供 HWND 和呈现图面的表示源。 标准数据绑定(到本地源的绑定,例如,其他属性或直接定义的数据源)将在 Loaded 之前发生。 可能已发生异步数据绑定(外部或动态源),但是根据其异步特性的定义不能保证已发生异步数据绑定(外部或动态源)。
引发 Loaded 事件的机制不同于 Initialized。 将逐个元素引发 Initialized 事件,而无需通过整个元素树直接协调。 相反,引发 Loaded 事件是在整个元素树内协调的结果(特别是逻辑树)。 当树中所有元素都处于被视为已加载状态中时,将首先在根元素上引发 Loaded 事件。 然后在每个子级元素上连续引发 Loaded 事件。
注意 |
---|
这种行为表面上可能类似路由事件的隧道。但是,未将任何信息从事件传送到事件。每个元素始终有机会处理其 Loaded 事件,并且将事件数据标记为已处理仅影响该元素。 |
Unloaded
最后引发 Unloaded,并由表示源或要移除的可视父级启动。 当引发 Unloaded 并对其进行处理后,可能还未设置属于事件源父级(由 Parent 属性确定)的元素或逻辑树或可视树中任何给定元素以上的元素,因此可能无法将样式设置为其正常或最后已知的运行时值。
生存期事件应用程序模型元素
以元素的通用生存期事件为基础构建的有以下应用程序模型元素:Application、Window、Page、NavigationWindow 和 Frame。 这些元素使用与其特定用途关联的附加事件扩展了通用生存期事件。 将在以下位置详细介绍这些内容: