WPF对象生命中的事件们

原文:http://msdn.microsoft.com/en-us/library/ms754221.aspx

本文讨论WPF控件对象的生命期内各重要阶段的事件们。
本文包含以下几节:
1 先决条件们
2 对象生命中的事件们
3 元素生命期内的通常事件
4 生命期事件们的程序模型元素们

1 先决条件们
假设你已完全理解依赖属性,并掌握XAML语言。

2 对象生命中的事件们
.net的托管代码中的对象们都具有相同的生命阶段:创建,使用,销毁。一些对象还有一个作为销毁阶段一部分的finalization阶段。WPF对象们,更具体指被WPF作为元素的可视化对象们,具有它们自己的一些共同的生命阶段。WPF的应用模型以一系列的事件暴露这些阶段。与生命期事件有关的WPF对象被分为四大类:一般元素,window元素,navigation host和程序对象。本文先论述所有元素共有的生命期事件们然后介绍程序对象,然后介绍程序对象,windows和navigation hosts的特有事件。

3 元素们的共有生命期事件们
所有的WPF框架级元素们(那些从rameworkElement或FrameworkContentElement派生的对象们)都具有三个生命期事件:Initialized,Loaded,Unloaded。
Initialized
Initialized 是第一个被触发的事件。它基本上对应于对象的构造方法调用阶段。因为这个事件是初始化完成后发出,这就保证了对象的所有的属性都被设置(一个例外是属性值被设置为动态资源或绑定)。保证所有属性都被设置的后果是,对象树中的最顶端的叶节点的对象必须先被初始化,然后是父节点,然后是爷节点,然后是曾爷节点,层层上走,直到根。之所以这样是因为父子关系以及包含关系都是属性的形式存在。这样带来的好处是保证了直到所有的子元素的所有的属性都被设置后,父元素才报告初始化的完成。
当你为Initialized事件写响应方法时,你必须明白在这里不会保证目标元素所在树中的其它元素都被创建了,尤其要注意目标元素的父元素。成员变量可能是null,或binding的数据源没有产生数据。
Loaded
Loaded事件是第二个被触发的。Loaded事件在最终显示之前发出,此时已完成了布局。Loaded保证逻辑树完整建立,并连接到了可以画界面的具有HWND的呈现源。标准数据绑定在Loaded之前发生;异步数据绑定可能已发生了,也可能没有。
Loaded与Initialized事件的发出机制不同。Initialized是从叶到根发出,而Loaded是等树上所有的元素都到达loaded状态后,再从根到叶依次发出事件。
注:这种行为很像路由事件,然而,没有数据从一个事件传递到另一个事件。每个元素都有机会去响应自己的Loaded事件,并且事件的参数只对本元素有效。

Unloaded
Unloaded的事件最后被调用(没有Uninitialized事件)。它是在本元素被移除时由所在的呈现源或可视父元素发出的。在Unloaded事件被处理时,元素的父元素,或在树中位于其祖辈的元素们,可能已经无效,这表示数据绑定,资源引用和样式们可能不再设置为它们的通常值或最后已知的运行时值。

4 生命期事件们的程序模型元素们
以下元素为程序模型元素:Application,Window,Page,NavigationWindow和Frame。它们在共同的生命期事件之上扩展了自己的特有事件。
posted @ 2011-07-12 14:28  移动应用开发  阅读(186)  评论(0编辑  收藏  举报