现在的位置: 首页 > 综合 > 正文

XAML语法术语基础教程(2)

2013年04月19日 ⁄ 综合 ⁄ 共 2405字 ⁄ 字号 评论关闭

属性元素语法

属性元素语法是一种与基本 XML 语法稍有偏离的语法。在 XML 中,属性值是一个实际的字符串,唯一可能的变化是使用除 UTF-8 之外的哪种字符串编码格式。在 XAML 中,可以指定其他对象元素作为属性值。此功能由属性元素语法来启用。不将属性 (Property) 指定为元素标记中的一个属性 (Attribute),而是使用元素的开始标记指定格式为元素类型名称.属性名 的属性 (Property),再指定属性 (Property) 值,然后结束属性元素。

具体而言,该语法以左尖括号 (<) 开头,其后紧跟包含属性元素语法的类或结构的类型名称。类型名称后面紧跟一个点 (.),再后面是必须在指定类型的成员表中存在的属性名,最后面是一个右尖括号 (>)。要赋给属性的值包含在相应的属性元素中。通常,值作为一个或多个对象元素提供,因为将对象指定为值正是属性元素语法应当实现的方案。最后,必须提供一个等效的结束标记来指定同一个元素类型名称.属性名称 组合,并与其他元素标记对形成正确的嵌套和平衡。例如,下面的属性元素语法针对的是 Button 的 ContextMenu 属性。

值也可以作为内部文本提供,但是,只有当指定的属性类型是基元值类型(如 String)或者是指定了名称的枚举时,才能这样做。这两个用法不太常见,因为这两种情况都还支持属性语法。用字符串填充属性元素的一个方案是,对于不是 XAML 内容属性但是仍用于表示 UI 文本的属性,UI 文本中必须出现特定的空白元素(如换行符)。属性 (Attribute) 语法不能保留换行符,但是属性 (Property) 元素语法可以保留换行符,不过前提是用来保留大量空白的功能处于活动状态.

属性元素不属于逻辑树,它不是由实例支持的元素,而只是一个用来设置属性的特定语法。

集合类型的属性元素语法

XAML 规范要求所实现的 XAML 处理器能够标识值类型是集合的属性。WPF 实现基于托管代码,它的 XAML 处理器通过下列操作之一来标识集合类型:

实现 IList。

实现 IDictionary。

从 Array 派生

如果属性的类型是集合,则不必在标记中指定所推断的集合类型。相反,应当成为集合中项的元素将被指定为集合类型属性元素的一个或多个子元素。在加载每个这样的项并通过调用隐式集合的 Add 方法将其添加到集合的过程中,会将该项计算为一个对象。例如,Style 的 Triggers 属性采用专用集合类型 TriggerCollection。但是,在标记中不必实例化 TriggerCollection,而是需要在 Style.Triggers 属性元素中指定一个或多个 Trigger 项作为元素,其中 Trigger(或派生类)是一个类型,应当作为隐式强类型 TriggerCollection 的项类型。

属性可以既是一个集合类型,又是该类型和派生类型的 XAML 内容属性。

隐式集合元素会在逻辑树中创建一个成员,即使它在标记中不显示为元素也是如此。通常,所拥有类型的构造函数针对作为其属性之一的集合执行实例化,这会将该集合添加到树中。

说明:

由 WPF XAML 处理器执行的集合检测功能不支持泛型列表和字典接口(IList<(Of <(T>)>) 和 IDictionary<(Of <(TKey, TValue>)>))。但是,可以将 List<(Of <(T>)>) 类用作基类(因为它直接实现 IList),或者将 Dictionary<(Of <(TKey, TValue>)>) 用作基类(因为它直接实现 IDictionary)。

XAML 内容语法

XAML 内容语法仅在将 ContentPropertyAttribute 指定为其类声明一部分的类上启用。ContentPropertyAttribute 需要一个按名称指定属性的参数,而该属性名称被定义为这种类型元素(包括派生的类)的内容属性。为此指定的属性是元素的 XAML 内容属性。在由 XAML 处理器处理时,在元素的开始标记和结束标记之间找到的任何子元素或内部文本将被指定为该 XAML 内容属性的值。元素的属性元素标记不按照这种方式赋值;它们是先进行处理,而且不被视为“内容”。

正如对于任何其他属性一样,对象的 XAML 内容属性将属于特定类型。该类型可以是 Object 类型。该内容属性的类型可帮助定义对象的内容模型。例如,鉴于任何对象都可以变为内容,Object 的类型是松散的,但是即使这种松散类型也要求内容必须是单个对象。该单个对象可以是集合对象,但是即便如此,也只能将一个这样的集合对象指定为内容。

特定类型的内容模型在该类型的类页面上进行描述,或者编写成类型系列的单独概念性主题中并与每个相关的类型引用建立链接。

集合类型的内容语法

为了接受多个对象元素(或内部文本)作为内容,内容属性的类型必须是明确的集合类型。与集合类型的属性元素语法相似,XAML 处理器必须标识作为集合类型的类型。如果某个元素具有 XAML 内容属性,则该 XAML 内容属性的类型是集合。不必在标记中将隐含集合类型指定为对象元素,也不必将 XAML 内容属性指定为属性元素。因此,标记中明显的内容模型现在可以将多个子元素作为指定为内容。下面是 Panel 子类的内容语法。所有的 Panel 派生类都建立要成为 Children 的 XAML 内容属性,这需要一个类型为 UIElementCollection 的值。

请注意,标记中既不需要 Children 的属性元素也不需要 UIElementCollection 的元素。这是 XAML 的设计特征,其目的在于,使用直接的父-子元素关系将那些用来定义 UI 的递归包含的元素更直观地表示为嵌套元素树,而不必对属性元素标记或集合对象进行外部干预。实际上,按照设计,UIElementCollection 在标记中不能指定为对象元素。由于 UIElementCollection 唯一的用途就是作为隐式集合,因此它不公开公共的默认构造函数,因此不能实例化为对象元素。

抱歉!评论已关闭.