对象生存期事件

更新:2007 年 11 月

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

本主题包括下列各节。

  • 先决条件
  • 对象生存期事件
  • 元素通用生存期事件
  • 生存期事件应用程序模型元素
  • 相关主题

先决条件

本主题假定您从 Windows Presentation Foundation (WPF) 类的现有依赖项属性的使用者角度了解依赖项属性,并且已阅读依赖项属性概述主题。若要采用本主题中的示例,还应当了解可扩展应用程序标记语言 (XAML)(请参见 XAML 概述)并知道如何编写 WPF 应用程序。

对象生存期事件

Microsoft .NET Framework 托管代码中的所有对象都要经历类似的一系列的生命阶段,即创造、使用和析构。许多对象还包括生命终止阶段,该阶段属于析构阶段的一部分。WPF 对象,更具体而言,WPF 标识为元素的 Visual 对象,还具有对象生命的一系列通用阶段。WPF 编程和应用程序模型将这些阶段公开为一系列的事件。在 WPF 中有四种与生存期事件有关的主要类型的对象;即常规元素、窗口元素、导航宿主和应用程序对象。Windows 和导航宿主也都属于 Visual 对象(元素)这个较大的分组。本主题先介绍对所有元素都通用的生存期事件,然后介绍应用于应用程序定义、窗口和导航宿主的更具体的生存期事件。

元素通用生存期事件

任何 WPF 框架级元素(从 FrameworkElementFrameworkContentElement 派生的那些对象)都有三种通用的生存期事件: InitializedLoadedUnloaded

Initialized

首先引发 Initialized,大致对应于由对其构造函数的调用执行的对象的初始化。由于事件发生是为响应初始化,因此可以保证对象的所有属性均已设置。(诸如动态资源或绑定等表达式用法是个例外;这些将是不进行计算的表达式。) 需要设置所有属性的结果是,在标记中定义的嵌套元素引发的 Initialized 的序列将开始发生,其顺序是先是元素树中最深层的元素,然后是朝向根的父元素。此顺序的原因是父子关系和包容均为属性,因此直到填充该属性的子元素也完全初始化时,父级才能报告初始化。

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

Loaded

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

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

说明:

这种行为表面上可能类似路由事件的冒泡。但是,未将任何信息从事件传送到事件。每个元素始终有机会处理其 Loaded 事件,并且将事件数据标记为已处理仅影响该元素。

Unloaded

最后引发 Unloaded,并由表示源或要移除的可视父级启动。当引发 Unloaded 并对其进行处理后,可能还未设置属于事件源父级(由 Parent 属性确定)的元素或逻辑树或可视树中任何给定元素以上的元素,因此可能无法将样式设置为其正常或最后已知的运行时值。

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

构建于元素的通用生存期事件上的为以下应用程序模型元素: ApplicationWindowPageNavigationWindowFrame。这些元素使用与其特定用途关联的附加事件扩展了通用生存期事件。将在以下位置详细介绍这些内容:

请参见

概念

依赖项属性值优先级

路由事件概述