Silverlight对象树(4)

2012-04-09
浏览
导读:在托管代码或 JavaScript 中,您可以在运行时期间引用 Silverlight 的 Silverlight 对象树中的 对象。本主题介绍如何在 Silverlight 托管 API 中使用对象树。 对象树 对象树概念描述如何使在运行时在 Silverlight

在托管代码或 JavaScript 中,您可以在运行时期间引用 Silverlight 的 Silverlight 对象树中的 对象。本主题介绍如何在 Silverlight 托管 API 中使用对象树。

对象树

对象树概念描述如何使在运行时在 Silverlight 内容中创建和存在的对象彼此相关。关系基于对象具 有属性这一原则,在很多情况下属性的值是另一个对象,而此对象也具有属性。对象树具有分支,因为其 中某些属性是集合属性并具有多个对象;并且,对象树具有根,因为体系结构最终必须引用单个对象,而 该对象是与对象树之外的概念(例如,浏览器宿主或显示内容的 Silverlight 插件)之间的连接点。

尽管在概念上实际只有一个对象树,但 Silverlight API 不向您公开完整的树。大量的对象树结构实 际上是实现详细信息。而您具有对象特定的属性,这些属性影响树中特定点的子项值并且可能报告父项( 在大多数情况下,父轴是只读的,因为您通常是在代码中或通过 XAML 分析过程从根向上构建树)。例如 ,Panel 具有其 Children 属性,该属性设置子对象。FrameworkElement 具有用于报告父项的 Parent。 这两个 API 都在基类中,因此,它们可用于大量的 Silverlight 对象。

Silverlight 中一个相关的树概念是可视化树。可视化树概念指的是较大的对象树在经过编辑或筛选 后的表示形式。所应用的筛选器是在可视化树中只存在具有呈现含义的对象。例如,某个集合类不是可视 化树的一部分,而可视化树将集合抽象为一个“子项”概念。然而,如果您将加载的源 XAML 标记视为与 对象树近似的结构,则可视化树也可以包含并不直接显示的对象。这是因为,可视化树也报告作为特定控 件(这些控件来自所应用的控件模板或资源字典)的组成部分的对象。可视化树在内部用于 Silverlight 呈现过程,但了解一些有关可视化树的内容对于某些情形通常很重要,例如,在应用模板后编写或替换控 件模板或在运行时分析控件实例。对于这些情形,Silverlight 提供了 VisualTreeHelper API,它通过 一种方式检查可视化树,这种方式比您通过对象特定的父属性和子属性来实际实现更为一般化。

可视化树概念也存在于 WPF 中,它与 Silverlight 的可视化树概念类似。然而,一个显著的差异是 WPF 还提供一个附加的筛选器或对象树(称为“逻辑树”)的概念。逻辑树概念与某些属性系统行为相关 。Silverlight 不通过帮助器类来公开此逻辑树。Silverlight 中的确存在某些(但并非所有)相关的属 性行为,但由于没有用于访问这些行为的帮助器 API,因此,逻辑树概念在 Silverlight 中将没有用武 之地,因此本文档不讨论它。缺少逻辑树而引发的一个很小的兼容性问题是:FrameworkElement.Parent 属性行为在 Silverlight 版本 3 中是不同的,它实际上报告可视化树父项。

对象树和 XAML 标记

如果您将通过 Silverlight API 访问的对象树与 XAML 标记的树形状进行比较,它们在节点方面并不 完全匹配。这是因为 XAML 用于标记,并且在标记定义期间易于使用。例如,XAML 具有属性元素的概念 ,它提供相关的指导信息,当您发现一个元素嵌套在另一个元素内时,您可以选择要设置的属性。在对象 树中,这就像一个对象上的某个属性由另一个对象进行设置一样。相反,XAML 也具有内容属性的概念, 其中,所设置的属性在标记中甚至没有显式进行命名。XAML 具有的语法可以基于属性的字符串值创建对 象,也可以针对 XAML 标记中已存在但在其他位置定义的对象提供引用,或者完全位于标记外部。尽管存 在这些很小的不一致,但当您在 XAML 中定义用户界面时,您将在运行时定义最终 Silverlight 对象树 的近似结构。

引用对象属性

无论您通过何种方式从 Silverlight 对象树中获取对象引用,都将通过 object.property 表示法( 与 .NET 中 CLR 属性的核心概念相关)直接公开托管 API 中的属性。许多 Silverlight 2 属性的基础 是依赖项属性概念。依赖项属性和属性系统引入了一些其他可能的语法,用于通过与 object.property 不同的方式访问属性,但与附加属性的情况不同,这些属性并不常用,因此本主题不讨论它们。主题依赖 项属性概述中详细讨论了依赖项属性。

对象树中的附加属性

Silverlight 支持附加属性的概念。从对象树的角度来看,附加属性是可以附加到树中任何对象的属 性,而不考虑该对象的类型(尽管在 Silverlight 实现中,该对象至少必须是依赖项对象)。附加属性 值存在于对象树中,但是,如果您使用代码来访问它们,则必须使用与 object.property 表示法不同的 语法。

Silverlight编程模型、XAML和HTML DOM

Silverlight对象树

Silverlight中如何为浏览器外应用程序实现

Silverlight中如何为浏览器外支持配置应用

使用LINQ和ADO.NET创建Silverlight程序