本主题介绍可扩展应用程序标记语言 (XAML) 的标记扩展概念,包括其语法规则、用途以及底层的类对象模型。
XAML 处理器和标记扩展
XAML 处理器是指可根据其规范(通过编译或解释)将 XAML 接受为语言、并且可以生成结果基础类以供运行时对象模型使用(也是根据 XAML 规范)的任意程序。默认情况下,此类处理器要么将属性值解释为一个文本字符串,要么基于属性类型或该属性特定的类型转换器将该属性值转换为对象。不过,有时也存在要求其他行为的情况。例如,可能指示 XAML 处理器:某个属性的值应该是对已构造对象或静态对象的引用。或者指示 XAML 处理器使用向对象的构造函数提供非默认参数的语法。相对于指定的 XAML 处理器默认行为,这是一种反常行为。
基本标记扩展语法
可以实现标记扩展以便为属性 (Attribute) 用法中的属性 (Property) 和/或属性 (Property) 元素用法中的属性 (Property) 提供值。
当用于提供属性 (Attribute) 值时,将标记扩展与 XAML 处理器区分开来的语法就是左右大括号({ 和 })。然后,由紧跟在左大括号后面的字符串标记来标识标记扩展的类型。
当用在属性元素语法中时,标记扩展在外观上与其他任何用于提供属性元素值的元素相同,即:一个将标记扩展类作为一个元素引用并以尖括号 (<>) 括起的 XAML 元素声明。
特定于 WPF 的标记扩展
WPF 编程中最常用的标记扩展是支持资源引用的标记扩展(StaticResource 和 DynamicResource)以及支持数据绑定的标记扩展 (Binding)。
StaticResource 通过替换已定义资源的值来为 XAML 属性提供值。
DynamicResource 通过将值推迟为对资源的运行时引用来为 XAML 属性提供值。动态资源引用强制在每次访问此类资源时都重新进行查找。
Binding 按应用于元素的数据上下文来为属性提供数据绑定值。此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。
RelativeSource 为可以在运行时元素树中定位若干可能关系的 Binding 提供源信息。对于在多用途模板中创建的绑定,或在未充分了解周围的元素树的情况下以代码创建的绑定,上述标记扩展会提供专用源。
通过 TemplateBinding,控件模板可以使用来自要利用该模板的类的对象模型定义属性中的模板化属性的值。
XAML 定义的标记扩展
有几个标记扩展并非是 XAML 的 WPF 应用程序所特有的,而是属于 XAML 语言的规范和命名空间的一部分。它们通常由语法中的 x: 前缀标识,如您在常见用法中所见到的一样。这些标记扩展的 WPF 实现使用相同的 MarkupExtension 基类来提供实现。
说明:
x: 前缀在 XAML 应用程序或文档的根元素中用于 XAML 命名空间的典型命名空间映射。例如,Microsoft Visual Studio 2005 模板使用此 x: 映射启动 XAML 文件。您可以在自己的 xmlns 映射中选择一个不同的前缀标记,但是本文档采用默认的 x: 映射,作为标识那些属于 XAML 命名空间已定义部分的实体的一种方式,这与 WPF 命名空间或其他任意命名空间是相反的。
x:Type 为命名类型提供 Type 对象。此标记扩展最常用于样式和模板。
x:Static 从不直接属于属性值类型、但可以计算为该类型的值类型代码实体中生成静态值。
x:Null 将 null 指定为 XAML 属性的值。
在特意不使用基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。
有关标记扩展语法的更多信息
*Extension 类
每个标记扩展的行为都会通过从 MarkupExtension 派生的 *Extension 类通知给 XAML 处理器,并提供 ProvideValue 方法的实现。每个扩展的此方法都会定义在计算标记扩展后将返回哪个对象。通常,通过使用传递给标记扩展的各个字符串标记来对返回的对象进行实例化或设置。
例如,StaticResourceExtension 类提供实际资源查找的图面实现,以便其 ProvideValue 实现返回请求的对象,该特定实现的输入是用于按其 x:Key 查找资源的字符串。如果您使用的是现有标记扩展,则其中的大部分实现详细信息都无关紧要。
后续字符串标记的扩展类解释
跟在标记扩展标识符后面、并且仍在括号内的字符串标记由 XAML 处理器通过以下方式之一解释: