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 加载时进行,并且在运行时没有访问对象图的权限。
  • DynamicResource 通过将值推迟为对资源的运行时引用来为属性提供值。

    • 动态资源引用强制在每次访问此类资源时都进行新查找,且在运行时有权访问对象图。
    • 为了获取此访问权限,WPF 属性系统中的依赖项属性和计算出的表达式支持 DynamicResource 概念。 因此,只能对依赖项属性目标使用 DynamicResource。
  • Binding 使用在运行时应用于父对象的数据上下文来为属性提供数据绑定值。

    • 此标记扩展相对复杂,因为它会启用大量内联语法来指定数据绑定。
  • RelativeSource 提供的源信息 Binding ,该信息可在运行时对象树中导航几个可能的关系。

    • 对于在多用途模板中创建的绑定,或在未充分了解周围的对象树的情况下以代码创建的绑定,此标记扩展为其提供专用源。
  • TemplateBinding 使控件模板能够使用模板化属性的值,这些属性来自于将使用该模板的类的对象模型定义属性。

    • 换言之,模板定义中的属性可访问仅在应用了模板之后才存在的上下文。
  • ColorConvertedBitmap 支持相对高级的映像方案。

  • ComponentResourceKey 和 ThemeDictionary 支持资源查找的各个方面,特别是支持查找与自定义控件一起打包的资源和主题。

RelativeSource MarkupExtension

  1. 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 模式是可选的。 上级级别(在逻辑树中向父级方向计算)。

WPF学习目录

posted @ 2021-07-04 22:08  x_amos  阅读(84)  评论(0编辑  收藏  举报