x:Static 标记扩展

引用以符合公共语言规范 (CLS) 的方式定义的任何静态按值代码实体。 可使用引用的静态属性在 XAML 中提供属性的值。

XAML 属性用法

<object property="{x:Static prefix:typeName.staticMemberName}" .../>

XAML 值

说明
prefix 可选。 一个前缀,它引用映射的非默认 XAML 命名空间。 prefix 在用法中显式显示,因为极少引用来自默认 XAML 命名空间的静态属性。 请参阅“备注”。
typeName 必需。 用于定义所需静态成员的类型名称。
staticMemberName 必需。 所需静态值成员(常量、静态属性、字段或枚举值)的名称。

备注

引用的代码实体必须是以下项之一:

  • 常量
  • 静态属性
  • 字段
  • 枚举值

如果 XAML 是标记编译的,则指定任何其他代码实体(例如非静态属性)会导致编译时错误或 XAML 加载时分析异常。

可以对不在当前 XAML 文档的默认 XAML 命名空间中的静态字段或属性进行 x:Static 引用,但这需要前缀映射。 XAML 命名空间始终是在 XAML 文档的根元素上定义的。

当 .NET XAML 服务及其 XAML 读取器和 XAML 编写器使用默认 XAML 架构上下文运行时,它们可以针对静态属性执行查找操作。 此 XAML 架构上下文可以使用 CLR 反射为对象图构造提供必要的静态值。 指定的 typeName 实际上是 XAML 类型名称,而不是 CLR 类型名称,不过在使用默认 XAML 架构上下文或使用所有现有的基于 CLR 的 XAML 实现框架时,这两者本质上是相同的。

进行不直接作为属性值类型的 x:Static 引用时,请务必小心。 在 XAML 处理序列中,标记扩展提供的值不会调用其他值转换。 即使 x:Static 引用创建文本字符串也是如此,并且通常针对该特定成员或返回类型的任何成员值基于文本字符串对属性值进行值转换。

特性语法是最常用于该标记扩展的语法。 在 x:Static 标识符字符串之后提供的字符串标记被指定为基础 Member 扩展类的 StaticExtension 值。

还有另外两种 XAML 用法在技术上是可行的。 但是,这些用法不太常见,因为它们十分复杂:

  1. 对象元素语法。

    <x:Static Member="prefix:typeName.staticMemberName" ... />
    
  2. 具有用于初始化字符串的显式 Member 属性的属性语法。

    <object property="{x:Static Member=prefix:typeName.staticMemberName}" ... />
    

在 .NET XAML 服务实现中,对此标记扩展的处理由 StaticExtension 类定义。

x:Static 是标记扩展。 XAML 中的所有标记扩展在其属性语法中均使用 {} 字符,正是依据这一约定,XAML 处理器认定标记扩展必须提供值。 有关标记扩展的详细信息,请参阅 Markup Extensions for XAML Overview

WPF 用法注释

用于 WPF 编程的默认 XAML 命名空间不包含许多有用的静态属性,而大多数有用的静态属性都支持无需 {x:Static} 即可使用的类型转换器。 对于静态属性,如果满足以下条件之一,则必须为 XAML 命名空间映射前缀:

  • 你将引用存在于 WPF 中但不属于 WPF (http://schemas.microsoft.com/winfx/2006/xaml/presentation) 的默认 XAML 命名空间的类型。 这是使用 x:Static 的一个相当常见的场景。 例如,可以将 x:Static 引用与映射到 System CLR 命名空间和 mscorlib 程序集的 XAML 命名空间结合使用,以便引用 Environment 类的静态属性。

  • 你将从自定义程序集中引用某个类型。

  • 你将引用 WPF 程序集中存在的某个类型,但该类型位于未映射到 WPF 默认 XAML 命名空间的一部分的 CLR 命名空间内。 CLR 命名空间到 WPF 的默认 XAML 命名空间的映射由各种 WPF 程序集中的定义执行(有关此概念的详细信息,请参阅用于 WPF XAML 的 XAML 命名空间和命名空间映射)。 如果 CLR 命名空间主要是由通常不用于 XAML 的类定义(例如 System.Windows.Threading)组成的,则可以存在非映射 CLR 命名空间。

有关如何为 WPF 使用前缀和 XAML 命名空间的详细信息,请参阅用于 WPF XAML 的 XAML 命名空间和命名空间映射

另请参阅