x:Key 指令
唯一标识在 XAML 定义的字典中创建和引用的元素。 将 x:Key
值添加到 XAML 对象元素是标识资源字典中的资源的最常用方法,例如在 WPF ResourceDictionary中。
XAML 属性用法
<object x:Key="stringKeyValue".../>
-or-
<object x:Key="{markupExtensionUsage}".../>
XAML 属性用法(特定于 WPF)
<object.Resources>
<object x:Key="stringKeyValue".../>
</object.Resources>
-or-
<object.Resources>
<object x:Key="{markupExtensionUsage}".../>
</object.Resources>
XAML 值
价值 | 描述 |
---|---|
stringKeyValue |
要用作键的文本字符串。 文本字符串必须符合 XamlName 语法。 |
markupExtensionUsage |
在标记扩展分隔符 {}中,标记扩展用法提供用作键的对象。 请参阅“备注”。 |
言论
x:Key
支持 XAML 资源字典概念。 XAML 作为语言未定义资源字典实现,该实现留给特定的 UI 框架。 若要详细了解如何在 WPF 中实现 XAML 资源字典,请参阅 XAML 资源概述(WPF .NET)。
在 XAML 2006 和 WPF 中,x:Key
必须作为属性提供。 你仍然可以使用非字符串键,但这需要标记扩展用法才能以属性形式提供非字符串值。 如果使用 XAML 2009,则可以将 x:Key
指定为元素,以显式支持由字符串以外的对象类型键控的字典,而无需标记扩展中间。 请参阅本主题中的“XAML 2009”部分。 “备注”部分的其余部分专门适用于 XAML 2006 实现。
x:Key
的属性值可以是 XamlName 语法 中定义的任何字符串,也可以是通过标记扩展计算的对象。 有关 WPF 的示例,请参阅“WPF 用法说明”。
作为 IDictionary 实现的父元素的子元素通常必须包含一个指定该字典中唯一键值的 x:Key
属性。 框架可能实现别名键属性来替代特定类型的 x:Key
;定义此类属性的类型应使用 DictionaryKeyPropertyAttribute进行特性化。
指定 x:Key
的代码等效项是用于基础 IDictionary的键。 例如,在 WPF 中资源标记中应用的 x:Key
相当于在代码中将资源添加到 WPF ResourceDictionary 时 ResourceDictionary.Addkey
参数的值。
WPF 用法说明
作为 IDictionary 实现的父对象的子对象(如 WPF ResourceDictionary)通常必须包含 x:Key
属性,并且键值在该字典中必须唯一。 有两个值得注意的异常:
某些 WPF 类型声明用于字典用法的隐式密钥。 例如,具有 TargetType的 Style 或具有 DataType的 DataTemplate 可以位于 ResourceDictionary 中并使用隐式密钥。
WPF 支持合并的资源字典概念。 密钥可以在合并字典之间共享,可以使用 FindResource访问共享密钥行为。 有关详细信息,请参阅 合并资源字典。
在 WPF XAML 实现和应用程序模型中,XAML 标记编译器不会检查键唯一性。 相反,缺失或非统一 x:Key
值会导致加载时 XAML 分析器错误。 但是,Visual Studio 处理 WPF 的字典通常可以在设计阶段记下此类错误。
请注意,在显示的语法中,ResourceDictionary 对象隐式表示 WPF XAML 处理器如何生成集合以填充 Resources 集合。 通常不会将 ResourceDictionary 显式提供为标记中的元素,尽管在某些情况下,如果需要清楚起见(这将是 Resources 属性元素和填充字典中的项之间的集合对象元素)。 有关集合对象几乎始终是标记中的隐式元素的原因,请参阅 XAML 语法详细信息。
在 WPF XAML 实现中,资源字典键的处理由 ResourceKey 抽象类定义。 但是,WPF XAML 处理器会根据其用法为密钥生成不同的基础扩展类型。 例如,将单独处理 DataTemplate 或任何派生类的键,并生成不同的 DataTemplateKey 对象。
键和名称在基本 XAML 定义中使用不同的指令和语言元素(x:Key
与 x:Name
)。 这些概念的 WPF 定义和应用也在不同的情况下使用键和名称。 有关详细信息,请参阅 WPF XAML 名称范围。
如前所述,键的值可以通过标记扩展提供,也可以是字符串值以外的值。 一个示例 WPF 方案是,x:Key
的值可能是 ComponentResourceKey。 某些控件为自定义样式资源公开该类型的样式键,该键会影响该控件的外观和行为的一部分,而不会完全替换样式。 此类键的一个示例是 ButtonStyleKey。
WPF 合并字典功能引入了键唯一性和键查找行为的其他注意事项。 有关详细信息,请参阅 合并资源字典。
XAML 2009
XAML 2009 放宽了始终以属性形式提供 x:Key
的限制。
在 WPF 中,可以使用 XAML 2009 功能,但仅适用于未编译标记的 XAML。 WPF 的标记编译 XAML 和 XAML 的 BAML 形式目前不支持 XAML 2009 关键字和功能。
在 XAML 2009 下,可以通过以下用法指定 x:Key
元素:
XAML 元素用法(仅限 XAML 2009)
<object>
<x:Key>
keyObject
</x:Key>
...
</object>
XAML 值
价值 | 描述 |
---|---|
keyObject |
用作专用字典中给定 object 键的对象的对象元素。 |
此处未显示此类使用的容器/父级。
object
应为表示专用字典实现的对象元素的子元素。keyObject
应是一个对象实例(或值类型的值),该实例适合用作该特定专用字典实现的键。WPF 不实现需要此用法的字典。 对象键是 XAML 语言的一般功能,对于某些在 XAML 中创建字典的自定义词典方案可能很有用。 对于对资源使用非字符串键的隐式样式等 WPF 功能,其他用于建立或指定键的技术存在,因此不需要使用对象键。
keyObject
也可以是对象元素形式的标记扩展用法,而不是直接对象实例。
Silverlight 用法说明
Silverlight 的 x:Key
单独记录。 有关详细信息,请参阅 XAML 命名空间(x:)语言功能(Silverlight)。