x:Type 标记扩展

提供 CLR Type 对象,该对象是指定 XAML 类型的基础类型。

XAML 属性用法

<object property="{x:Type prefix:typeNameValue}" .../>

XAML 对象元素用法

<x:Type TypeName="prefix:typeNameValue"/>

XAML 值

说明
prefix 可选。 映射非默认 XAML 命名空间的前缀。 通常不需要指定前缀。 请参阅“备注”。
typeNameValue 必需。 可解析为当前默认 XAML 命名空间的类型名称;或指定的映射前缀(如果提供了 prefix)。

备注

x:Type 标记扩展具有与 C# 中的 typeof() 运算符或 Microsoft Visual Basic 中的 GetType 运算符类似的功能。

x:Type 标记扩展为采用 Type 类型的属性提供从字符串转换行为。 输入是 XAML 类型。 输入 XAML 类型和输出 CLR Type 之间的关系是,在根据 XAML 架构上下文和上下文提供的 IXamlTypeResolver 服务查找必要的 XamlType 之后,输出 Type 是输入 XamlTypeUnderlyingType

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

在具体的框架实现中,一些以 Type 为值的属性可以直接接受类型的名称(类型 Name 的字符串值)。 但是,实现此行为是一个复杂的方案。 有关示例,请参阅下面的“WPF 用法说明”部分。

特性语法是最常用于该标记扩展的语法。 在 x:Type 标识符字符串之后提供的字符串标记被指定为基础 TypeName 扩展类的 TypeExtension 值。 在基于 CLR 类型的 .NET XAML 服务的默认 XAML 架构上下文中,该特性的值为所需类型的 Name,或者包含 Name 且前缀为非默认 XAML 命名空间映射。

x:Type 标记扩展可用于对象元素语法。 在这种情况下,需要指定 TypeName 属性的值才能正确初始化扩展。

x:Type 标记扩展也可用作详细特性;但此用法并不典型:<object property="{x:Type TypeName=typeNameValue}" .../>

WPF 用法注释

默认 XAML 命名空间和类型映射

WPF 编程的默认 XAML 命名空间包含典型 XAML 方案所需的大多数 XAML 类型;因此,在引用 XAML 类型值时,通常可以避免使用前缀。 如果要从自定义程序集中引用类型,或者对于存在于 WPF 程序集中但来自未映射到默认 XAML 命名空间的 CLR 命名空间的类型,则可能需要映射前缀。 有关前缀、XAML 命名空间和映射 CLR 命名空间的详细信息,请参阅 WPF XAML 的 XAML 命名空间和命名空间映射

支持 Typename-as-String 的类型属性

WPF 支持能够指定某些 Type 类型属性的值而无需使用 x:Type 标记扩展的技术。 相反,你可以将值指定为命名类型的字符串。 例如 ControlTemplate.TargetTypeStyle.TargetType。 对此行为的支持不会通过类型转换器或标记扩展提供。 相反,这是通过 FrameworkElementFactory 实现的延迟行为。

Silverlight 支持类似的约定。 事实上,Silverlight 目前在其 XAML 语言支持中不支持 {x:Type},并且在旨在支持 WPF-Silverlight XAML 迁移的少数情况之外不接受 {x:Type} 用法。 因此,typename-as-string 行为内置于所有以 Type 为值的 Silverlight 本机属性评估。

XAML 2009

XAML 2009 为泛型类型提供了额外的支持,并修改了 x:TypeArgumentsx:Type 的功能行为以提供此支持。

  • x:TypeArguments 以及泛型对象实例化的关联对象元素可以位于根以外的元素上。 有关详细信息,请参阅 x:TypeArguments 指令 的“XAML 2009”部分。

  • XAML 2009 支持在标记中指定泛型类型约束的语法。 此功能可以由 x:TypeArgumentsx:Type 或这两种功能组合使用。

  • 处理 XAML 2009 以进行加载时的 WPF XAML 实现还会将此功能添加到使用类型 Type 的某些框架属性的隐式类型转换行为中。

在 WPF 中,可以使用 XAML 2009 功能,但只能用于松散 XAML(未进行标记编译的 XAML)。 WPF 的已编译标记的 XAML 以及 XAML 的 BAML 形式当前不支持 XAML 2009 关键字和功能。

另请参阅