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

在具有内容属性的对象中混合使用属性元素和对象元素

XAML 规范声明 XAML 处理器可以进行如下强制:用来填充某个对象元素中 XAML 内容属性的对象元素必须是连续的,而 且不得混合使用。对于混合使用属性元素和内容的这一限制是由 WPF XAML 处理器强制的。

可以将子对象元素作为某个对象元素中的第一个直接标记,然后可以引入属性元素。也可以指定一个或多个属性元素,接着指定内容,然后指定多个属性元 素。但是,一旦内容后面跟有属性元素,您就不能进一步引入任何内容,而只能引入其他属性元素。

这个内容/属性元素顺序要求不适用于用作内容的内部文本。然而,这仍然是使内部文本保持连续的不错的标记样式,原因是,如果属性元素与内部文本交错 分布,则很难直观地检测标记中的大量空白。

附加属性

附加属性是 XAML 中引入的一个编程概念,借此,属性可以由类型拥有和定义,但可以在任何元素上设置。附加属性所面向的主要方案就是,允许元素树中的子元素向父元素报告信 息,而不要求使用在所有的元素之间广泛共享的对象模型。相反,附加属性可以由任何父元素用来向子元素报告信息。

附加属性使用的语法在表面上与属性元素语法非常相似,因为您还需要指定类型名.属性名 组合。二者有两个重要的差异:

即使在通过属性语法设置附加属性时,也可以使用类型名.属性名 组合。只有附加属性 (Property) 才要求属性 (Attribute) 语法中使用限定属性 (Property) 名。

对于附加属性还可以使用属性元素语法。但是,对于典型的属性元素语法,您指定的类型名 是包含属性元素的对象元素。如果您引用的是附加属性,则类型名 是用来定义附加属性的类,而不是包含对象元素。

附加事件

附加事件是 XAML 中引入的另一个编程概念,事件可以由类型定义,但是处理程序可以附加到任何对象上。用来定义附加事件的类型通常是用来定义服务的静态类型,这些附加事件有 时由用来公开服务的类型中的路由事件别名公开。附加事件的处理程序是通过属性语法指定的。正如对于附加事件一样,可以扩展附加事件的属性语法,以便允许使 用类型名.事件名,其中类型名 是为附加事件基础结构提供 Add 和 Remove 事件处理程序访问器的类,事件名 是事件名称。

XML 命名空间

上面的所有语法示例均未指定默认命名空间以外的命名空间。在典型的 WPF 应用程序中,默认命名空间被指定为 WPF 命名空间。您可以指定默认命名空间以外的命名空间,而且仍使用实质上同类的语法,但是,只要命名了无法在默认命名空间中访问的类,该类的名称就必须以用来 映射对应 CLR 命名空间的 XML 命名空间的前缀作为开头。例如, 是一种用来实例化 MyElement 类的实例的对象元素语法,其中包含该类的 CLR 命名空间(可能还有包含该命名空间的外部程序集)以前映射到 custom 前缀。

标记扩展

XAML 定义了一个标记扩展编程实体,该实体允许从 XAML 处理器对属性或对象元素的常规处理中进行转义,将该处理转给支持类。WPF 对 XAML 处理器的实现将 MarkupExtension 抽象类用作由 WPF 支持的所有标记扩展的基础。在使用属性语法时,用来标识 XAML 处理器的标记扩展的字符是左大括号 ({),其后是右大括号 (}) 以外的任何字符。左大括号后面的第一个字符串必须引用用来提供特定扩展行为的类,如果子字符串“Extension”是实际类名的一部分,则该引用可以省 略这个子字符串。该类后面可能会出现一个空格,该空格后面的每个字符都可以由所实现的扩展用作输入,直到遇到右大括号。在使用属性语法时,WPF 中标记扩展的主要用途是提供一种方法来引用其他已经存在的对象,或者将引用转给将在运行时计算的对象。例如,可以指定用 {Binding} 标记扩展来代替给定的属性通常将使用的值类型,从而完成简单的数据绑定。对于无法以其他方式使用属性 (Attribute) 语法的属性 (Property),许多标记扩展都允许使用属性 (Attribute) 语法。例如,Style 对象是一个相对复杂的引用类型,其中包含几个其他属性,每个属性都还采用 byref 对象(而非基元)。但是样式通常作为资源来创建,之后将通过请求资源的两个标记扩展之一来引用。该扩展将对属性 (Property) 值的计算推迟到资源查找时,允许在属性 (Attribute) 语法中提供 Style 属性 (Property) 的值并采用 Style 类型,如下所示:

 

在这里,StaticResource 用来标识 StaticResourceExtension 类,该类提供标记扩展实现。下一个字符串 MyStyle 用作非默认 StaticResourceExtension 构造函数的输入,在该构造函数中,从扩展字符串提取的参数用来声明所请求的 ResourceKey。MyStyle 应当是定义为资源的 Style 的 x:Key 属性 值。StaticResource 标记扩展用法要求使用该资源,在加载时通过静态资源查找逻辑来提供 Style 属性值。

可选的和不建议的 XAML 用法

属性元素的可选用法

属性元素的可选用法包括,具体地“拼出”由 XAML 处理器视为隐式的元素内容属性。例如,当您声明 Menu 的内容时,可以选择将 Menu 的 Items 集合显式声明为 属性元素标记,并将每个 MenuItem 放在 中,而不是使用隐式的 XAML 处理器行为(即,Menu 的所有子元素都必须是 MenuItem 而且放在 Items 集合中)。有时,这个可选用法可以帮助以可视方式阐明标记中所表示的对象结构。或者,属性元素的隐式用法有时可以避免使用在技术上具有功能但是在视觉上容 易引起混淆(如在属性值中嵌套标记扩展)的标记。

typeName.memberName 全限定属性

使用属性的类型名.成员名 格式实际上比仅仅使用路由事件的情况更为普遍,但是,在其他应用程序中,如果只是为了实现标记样式和可读性,则该格式是多余的,您应当避免使用它。在下面 的示例中,对 Background 属性的三个引用是完全等效的:

Button.Background 之所以适用,是因为在 Button 上对于该属性的查找是成功的(Background 是从 Control 继承的),而且 Button 是对象元素的类或者是基类。Control.Background 之所以适用,是因为 Control 类实际上定义 Background,而且 Control 是一个 Button 基类。

但是,下面的类型名.成员名 格式示例并不适用,因此显示为已注释掉:

Label 是 Control 的另一个派生类,而且,如果在 Label 对象元素中指定了 Label.Background,则该用法将适用。但是,由于 Label 不是 Button 的类或基类,因此指定的 XAML 处理器行为是随后以附加属性形式处理 Label.Background。Label.Background 不是附加属性,因此该用法将失败。

baseTypeName.memberName 属性元素

与类型名.成员名 格式如何适用于属性语法相似,基类型名称.成员名 语法适用于属性元素语法。例如,下面的语法适用:

在这里,即使属性元素包含在 Button 中,属性元素也会以 Control.Background 形式提供。

但是,正如属性的类型名.成员名 格式一样,基类型名称.成员名 在标记中是很差的样式,您应当避免将其用于设置样式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值