x:Static 标记扩展

按值引用以符合 Common Language Specification (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 命名空间。

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

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

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

技术上,有其他两个可能的 XAML 用法。 但是,这些用法并不常见,因为它们不必太详细:

对象元素语法: <x:Static Member="prefix:typeName.staticMemberName" .../>

包含初始化字符串显示成员属性的特性语法: <object property="{x:Static Member=prefix:typeName.staticMemberName}" .../>

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

x:Static 是标记扩展。 XAML 中的所有标记扩展在其特性语法中都使用 { 和 } 字符,XAML 处理器通过这一约定识别出标记扩展必须提供一个值。 有关标记扩展的更多信息,请参见XAML 的标记扩展概述

WPF 用法说明

用于 WPF 编程的默认 XAML 命名空间不包含许多有用的静态属性,且大多数有用静态属性有支持,例如不需要请求 {x:Static} 就可以对该用法有帮助的类型转换器。 对于静态属性,如果以下值之一为 true,则您必须为 XAML 命名空间映射一个前缀:

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

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

  • 您所引用的类型存在于 WPF 程序集中,但该类型所在的 CLR 命名空间未映射为 WPF 默认 XAML 命名空间的一部分。 CLR 命名空间到用于 WPF 的默认 XAML 命名空间的映射可以由多种 WPF 程序集中的定义来执行(有关此概念的详细信息,请参见 WPF XAML 的 XAML 命名空间和命名空间映射)。 如果 CLR 命名空间大部分由通常不用于 XAML 的类定义(如 System.Windows.Threading)组成,则未映射的 CLR 命名空间可能存在。

有关如何使用前缀和 WPF 的 XAML 命名空间的更多信息,请参见 WPF XAML 的 XAML 命名空间和命名空间映射

请参见

参考

x:Type 标记扩展

其他资源

从 WPF 迁移到 System.Xaml 的类型