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 构造函数签名和位置参数用法。 targetTypeName
和 targetID
的给出顺序很重要。 详细语法依赖于 ComponentResourceKey 无参数构造函数,然后以类似于对象元素上的真正属性语法的方式设置 TypeInTargetAssembly 和 ResourceId。 在详细语法中,设置属性的顺序并不重要。 标记扩展和 WPF XAML 主题中更详细地描述了这两种替代方案(简明和详细)的关系和机制。
从技术上讲,targetID
的值可以是任何对象,不用非得是字符串。 但是,WPF 中最常见的用法是将 targetID
值与字符串形式对齐,并且此类字符串在 XamlName 语法 中有效。
ComponentResourceKey
可以在对象元素语法中使用。 在这种情况下,需要同时指定 TypeInTargetAssembly 和 ResourceId 属性的值才能正确初始化扩展。
在 WPF XAML 读取器实现中,对此标记扩展的处理由 ComponentResourceKey 类定义。
ComponentResourceKey
是标记扩展。 当要求转义特性值应为非文本值或非处理程序名称时,通常会实现标记扩展,相对于只在某些类型或属性上放置类型转换器而言,此需求更具有全局性。 XAML 中的所有标记扩展在其特性语法中均使用 { 和 } 字符,正是依据这一约定,XAML 处理器认定标记扩展必须处理特性。 有关详细信息,请参阅标记扩展和 WPF XAML。