x:Static 标记扩展
更新:2007 年 11 月
引用以符合公共语言规范 (CLS) 的方式定义的任何静态的按值代码实体。引用的属性在加载 XAML 页的余下部分之前计算,可用于以 XAML 提供属性值。
XAML 属性用法
<object property="{x:Static prefix:typeName.staticMemberName}" .../>
XAML 对象元素用法
<object>
<object.property>
<x:Static Member="prefix:typeName.staticMemberName" .../>
</object.property>
</object>
XAML 值
prefix |
可选。映射非默认 xmlns 命名空间的前缀。请参见“备注”。 |
typeName |
必需。定义所需的静态成员的类型。 |
staticMemberName |
必需。所需的静态值成员的名称(常量、静态属性、字段或枚举值)。 |
备注
引用的代码实体必须是下面的某一项:
常量
静态属性
字段
枚举值
指定其他任何代码实体(如非静态属性)会导致编译时错误。
可以对不在默认 xmlns 命名空间中的静态字段或属性进行 x:Static 引用,但这需要前缀映射。可以为任何给定的 XAML 元素定义默认 xmlns 命名空间并将此作为一个属性。通常,这是在根元素上定义的,以便 xmlns 应用于根元素下的所有元素。通常,用于 Windows Presentation Foundation (WPF) 编程的默认 XML 命名空间是 WPF 命名空间。如果满足以下条件之一,则必须映射前缀:
您所引用的类型存在于 Microsoft .NET Framework 中,但不属于 WPF 命名空间的一部分。这是一种非常常见的使用 x:Static 的情况。例如,可以将 x:Static 引用与映射到 System CLR 命名空间的前缀映射一起使用,以便引用 Environment 类的静态属性。
您从自定义程序集引用类型。
您所引用的类型存在于 WPF 程序集中,但该类型所在的 CLR 命名空间未映射为 WPF 命名空间的一部分。该映射由该程序集中的定义执行。在通常不用于 XAML 的 CLR 命名空间(如 System.Windows.Threading)中,未映射的 CLR 命名空间通常用于 WPF 类定义。
有关前缀和 XML 命名空间的更多信息,请参见 XAML 命名空间和命名空间映射。
您可以使用并非直接是属性值的类型、但可以计算为该类型的 x:Static 引用。例如,您可以使用 x:Static 引用来从枚举或静态属性(例如 SystemColors 定义的各种颜色和画笔)中获取值。x:Static 引用可以用于在 XAML 语法中设置任意属性,甚至那些可能实际基于具有引用类型的属性的属性,因为 x:Static 值在计算后的实际处理可能会有变化,具体取决于应用静态值的属性的类型转换器行为。
属性语法是最常用于此标记扩展的语法。在 x:Static 标识符字符串之后提供的字符串标记被指定为基础 StaticExtension 扩展类的 Member 值。
x:Static 可以在对象元素语法中使用。在这种情况下,需要指定 Member 属性的值。
x:Static 还可以在将 Member 属性 (Property) 指定为“属性 (Property) =值对”的详细属性 (Attribute) 用法中使用:
<object property="{x:Static Member=prefix:typeName.staticMemberName}" .../>
如果扩展具有一个以上的可设置属性,或者某些属性是可选的,则详细用法通常会很有用。由于 x:Static 仅有一个可设置的属性,并且此属性是必需的,因此该详细用法不具有典型性。
在 WPF XAML 处理器实现中,对此标记扩展的处理由 StaticExtension 类定义。
x:Static 是标记扩展。当要求转义属性 (attribute) 值应为非文本值或非处理程序名称时,通常会实现标记扩展,相对于只在某些类型或属性 (property) 上放置类型转换器而言,此要求更具有全局性。XAML 中的所有标记扩展在其属性语法中都使用 { 和 } 字符,XAML 处理器通过这一约定确认标记扩展必须处理该属性。有关标记扩展的一般详细信息,请参见标记扩展和 XAML。