x:Static Markup Extension

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

XAML 属性用法

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

XAML 值

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

言论

所引用的代码实体必须是下列实体之一:

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

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

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

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

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

属性语法是用于此标记扩展的最常见语法。 在将 x:Static 标识符字符串分配为基础 StaticExtension 扩展类的 Member 值之后提供的字符串令牌。

在技术上,还有其他两种 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 处理器识别标记扩展必须提供值的约定。 有关标记扩展的详细信息,请参阅 XAML 的标记扩展概述

WPF 用法说明

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

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

  • 从自定义程序集引用类型。

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

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

另请参阅