6. 标记扩展和 WPF XAML
WPF学习目录
标记扩展和 WPF XAML
XAML 定义的标记扩展
存在这么几种标记扩展,它们并非特定于 XAML 的 WPF 实现,而是语言形式的 XAML 的内部函数或功能的实现。
这些标记扩展在 System.Xaml 程序集中作为常规 .NET Framework XAML 服务的一部分而实现,并且位于 XAML 语言 XAML 命名空间内。
就常见标记用法而言,这些标记扩展通常可由用法中的 x: 前缀标识。
在MarkupExtension基类中定义的,它提供了所有标记扩展应使用的模式,以便在 xaml 读取器和 xaml 编写器(包括在 WPF Xaml 中)中受支持。
x:Type 为命名类型提供 Type 对象。 此扩展最常用于样式和模板。
x:Static 生成静态值。 这些值来自于值类型代码实体,它们不直接是目标属性值的类型,但可以计算为该类型。
x:Null 将 null 指定为属性的值,可用于特性或属性元素值。
在特意不使用 WPF 基元素和控件模型提供的集合支持的情况下,x:Array 为 XAML 语法中常规数组的创建提供支持。
特定于 WPF 的标记扩展
WPF 编程中最常用的标记扩展是支持资源引用的标记扩展(StaticResource 和 DynamicResource),和支持数据绑定的标记扩展 (Binding)。
-
StaticResource 通过
替换已定义资源的值
来为属性提供值。- StaticResource 计算最终在
XAML 加载时进行
,并且在运行时没有访问对象图的权限。
- StaticResource 计算最终在
-
DynamicResource 通过将值推迟为对
资源的运行时引用
来为属性提供值。- 动态资源引用强制在每次访问此类资源时都进行新查找,且在运行时有权访问对象图。
- 为了获取此访问权限,WPF 属性系统中的依赖项属性和计算出的表达式支持 DynamicResource 概念。 因此,只能对依赖项属性目标使用 DynamicResource。
-
Binding 使用在运行时应用于父对象的数据上下文来为属性提供数据绑定值。
- 此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。
-
RelativeSource 提供的源信息 Binding ,该信息可在运行时对象树中导航几个可能的关系。
- 对于在多用途模板中创建的绑定,或在未充分了解周围的对象树的情况下以代码创建的绑定,此标记扩展为其提供专用源。
-
TemplateBinding
使控件模板能够使用模板化属性的值
,这些属性来自于将使用该模板的类的对象模型定义属性。- 换言之,模板定义中的属性可访问仅在应用了模板之后才存在的上下文。
-
ColorConvertedBitmap 支持相对高级的映像方案。
-
ComponentResourceKey 和 ThemeDictionary 支持资源查找的各个方面,特别是支持查找与自定义控件一起打包的资源和主题。
RelativeSource MarkupExtension
- XAML 属性用法
<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />
2.XAML 属性用法(嵌套在 Binding 扩展内)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />
3.XAML 对象元素用法
<Binding>
<Binding.RelativeSource>
<RelativeSource Mode="modeEnumValue"/>
</Binding.RelativeSource>
</Binding>
或者
<Binding>
<Binding.RelativeSource>
<RelativeSource
Mode="FindAncestor"
AncestorType="{x:Type typeName}"
AncestorLevel="intLevel"/>
</Binding.RelativeSource>
</Binding>
modeEnumValue下列类型作之一:
- 字符串标记 Self ; 对应于创建的, RelativeSource 其 Mode 属性设置为 Self 。
- 字符串标记 TemplatedParent ; 对应于创建的, RelativeSource 其 Mode 属性设置为 TemplatedParent 。
- 字符串标记 PreviousData ; 对应于创建的, RelativeSource 其 Mode 属性设置为 PreviousData 。
FindAncestor:
- FindAncestor:字符串标记 FindAncestor。
- 使用此标记可输入一个模式,以便 RelativeSource 指定上级类型和可选的上级级别。 它对应于通过将 RelativeSource 属性设置为 Mode 而创建的 FindAncestor。
- typeName:对于 FindAncestor 模式是必需的。 类型的名称,用于填充 AncestorType 属性。
- intLevel:对于 FindAncestor 模式是可选的。 上级级别(在逻辑树中向父级方向计算)。