当前位置:K88软件开发文章中心编程全书编程全书01 → 文章内容

详解Silverlight的对象树

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 0:57:54

供一个值。这 就创建了一个直接引用,该引用可用于标记从 XAML 编译的类中,与遍历树相比,这种获取对象的方法出 错的可能性要低得多。

此外,如果您通过代码构造函数而不通过 XAML 加载来创建对象,则您应该能够构造您的代码,以便 您可以定义私有字段或变量来在运行时保留对象引用(保留在类中,或在应用程序级别存储为变量)。

然而,在某些情况下,向对象提供名称并在范围中保留对象引用是不可能的,也是不切实际的。一个 此类方案是:您正在添加由用户提供或通过数据绑定提供的动态内容,而您无法预测所添加的项数或运行 时对象树的结构。另一个方案是检查对于某个控件所应用的模板,或控件的某个组成部分。

警告说明警告:

Silverlight 通常支持“设置外观”概念,也称为重新设置控件样式或控件重新模板化。尤其是,如 果您是控件作者且正在编写控件的支持代码,则假定特定的树结构可能很危险。因为大多数控件支持可设 置的模板(无论您是否已启用多个特定的扩展点,如子部分样式),所以,运行时可视化树可能与通过所 应用的默认模板创建的树不同。请参见通过使用 ControlTemplate 自定义现有控件的外观。

用于遍历“子项”和其他集合的 Try-catch 逻辑

如果您遍历对象树的要求涉及到查找某些对象,而这些对象所表示的集合未表示为可视化树的一部分 ,则您可能需要编写专用的函数,以便尝试查找与特定的命名模式或特定类的对象模型相匹配的 API。

向下(远离根)遍历对象树的多个级别通常是可能的,只要您了解所包含的对象将具有集合的点。您 可能必须使用 try/catch 方法或其他等效方法来检测这一点,即检查 Children 是否存在以及 Count 是 否为非零值(此处的 Children 和 Count 是占位符,而不是文字 API;根据 .NET 命名原则,Children 和 Count 刚好是这些类型的属性的公共名称,但根据对象及其对象模型,实际属性可能具有不同的名称 )。总体 Silverlight 对象模型中的某些集合包含在未命名为 Children 的属性中。如果您知道您正在 遍历到某个未命名为 Children 的特定集合属性,则应在逻辑中说明此情况。

使用 VisualTreeHelper

VisualTreeHelper 是一个可用于遍历对象树的实用工具类。(可视化树的概念已在本主题前面的“对 象树”一节中介绍。)

因为您可以在运行时对可视化树执行操作,并且可以遍历到模板部件,所以这可能是一种可用来检查 模板组成情况的有用手段。此外,您可以检查可能通过数据绑定填充的子集合,或者您的应用程序代码可 能无法全部了解运行时对象树的完整本质的子集合。为此,您可以通过 GetChild 并将 GetChildrenCount 用作一个确定因素(确定树节点是单个项还是应按计数进行迭代的“子项”集合)来 遍历该树。

遍历模板内容

除VisualTreeHelper 之外,可用来遍历模板内容的另一个方法是 GetTemplateChild。使用 GetTemplateChild 或遍历模板内容通常是必要的,因为 FindName 的行为由名称范围概念控制。在这种 情况下,模板内容与对象树的其他部分具有特意不同的名称范围,因为模板是共享的,如果不采用单独的 名称范围,则在多次应用模板时会导致名称冲突。GetTemplateChild 按其模板名称范围 x:Name 值查找 对象,同时从应用该模板的特定 Control 的更大对象树范围中遍历。

Silverlight 对象和 HTML DOM

还有另一个对象模型可用于为 HTML 编写脚本:HTML 文档对象模型 (DOM)。然而,DOM 不会将 Silverlight 插件加载的内容标识为 DOM 的一个完整部分。

上一页  [1] [2] 


详解Silverlight的对象树