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

另请参阅