ComponentResourceKey 标记扩展

定义和引用从外部程序集加载的资源的键。 这使资源查找能够在程序集中指定目标类型,而不是程序集或类中的显式资源字典。

XAML 属性用法(设置键,压缩)

<object x:Key="{ComponentResourceKey {x:Type targetTypeName}, targetID}" ... />  

XAML 属性用法(设置键,详细)

<object x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}" ... />  

XAML 属性用法(请求资源,压缩)

<object property="{DynamicResource {ComponentResourceKey {x:Type targetTypeName}, targetID}}" ... />  

XAML 属性用法(请求资源,详细)

<object property="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}}" ... />  

XAML 值

价值 描述
targetTypeName 资源程序集中定义的公共语言运行时(CLR)类型的名称。
targetID 资源密钥。 查找资源时,targetID 类似于资源的 x:Key 指令

言论

如上述用法所示,{ComponentResourceKey} 标记扩展用法位于两个位置:

  • 主题资源字典中键的定义,由控件作者提供。

  • 重新模板化控件时,从程序集访问主题资源,但想要使用来自控件主题提供的资源的属性值。

对于引用来自主题的组件资源,通常建议使用 {DynamicResource} 而不是 {StaticResource}。 这在用法中被显示出来。 建议使用 {DynamicResource},因为用户可以更改主题本身。 如果希望最符合控件作者支持主题的意向的组件资源,则应使组件资源引用也保持动态。

TypeInTargetAssembly 标识在实际定义资源的目标程序集中存在的类型。 可以定义和使用 ComponentResourceKey,而不需要确切地知道 TypeInTargetAssembly 的定义位置,但最终必须通过引用的程序集来解析其类型。

ComponentResourceKey 的常见用法是定义随后作为类成员公开的键。 对于此用法,请使用 ComponentResourceKey 类构造函数,而不是标记扩展。 有关详细信息,请参阅 ComponentResourceKey,或者在主题 控件创作概述中的“定义和引用主题资源密钥”部分。

在建立键和引用键控资源时,属性语法通常用于 ComponentResourceKey 标记扩展。

显示的紧凑语法依赖于标记扩展的 ComponentResourceKey 构造函数签名和位置参数用法。 给出 targetTypeNametargetID 的顺序很重要。 详尽语法依赖于 ComponentResourceKey 无参数构造函数,然后以一种类似于对象元素真实属性语法的方式设置 TypeInTargetAssemblyResourceId。 在冗长语法中,设置属性的顺序并不重要。 在主题 标记扩展和 WPF XAML中,更详细地描述了这两种选择(紧凑和详细)的关系和机制。

从技术上看,targetID 的值可以是任何对象,它不必是字符串。 但是,WPF 中最常见的用法是将 targetID 值与字符串形式的表单保持一致,并且此类字符串在 XamlName 语法中有效。

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

在 WPF XAML 读取器实现中,此标记扩展的处理由 ComponentResourceKey 类定义。

ComponentResourceKey 是标记扩展。 当需要将属性值转义为非文本值或处理程序名称时,通常会实现标记扩展,并且其应用范围比仅将类型转换器应用于某些类型或属性更为广泛。 XAML 中的所有标记扩展在其属性语法中使用 { 和 } 字符,这是 XAML 处理器识别标记扩展必须处理该属性的约定。 有关详细信息,请参阅 标记扩展和 WPF XAML

另请参阅