Директива x:Key

Однозначно определяет элементы, которые создаются и ссылки на которые задаются в словаре XAML.

Использование атрибута 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

В пределах разделителей расширение разметки {} расширение разметки, предоставляющее объект, который будет использоваться в качестве ключа. См. примечания.

Заметки

В 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. Например, x:Key, применяемый в разметке для ресурса в WPF, эквивалентен значению параметра key метода ResourceDictionary.Add при добавлении ресурса в объект ResourceDictionary WPF в коде.

Примечания об использовании WPF

Дочерние объекты родительского объекта, которые являются реализацией IDictionary, например ResourceDictionary WPF, обычно должны включать атрибут x:Key, а значение ключа должно быть уникальным в пределах этого словаря. Существует два важных исключения:

  • Некоторые типы WPF объявляют неявный ключ для использования словаря. Например, объект Style со свойством TargetType или объект DataTemplate со свойством DataType может находиться в объекте ResourceDictionary и использовать неявный ключ.

  • WPF поддерживает концепцию объединенного словаря ресурсов. Ключи могут совместно использоваться объединенными словарями, а поведение общего ключа может быть доступно с помощью FindResource. Дополнительные сведения см. в разделе Объединенные словари ресурсов.

В общей реализации WPF XAML и модели приложения уникальность ключа не проверяется компилятором разметки XAML. Вместо этого, если значения x:Key отсутствуют или не являются уникальными, возникают ошибки средства синтаксического анализа XAML во время загрузки. Однако обработка словарей для WPF в Visual Studio часто обнаруживает такие ошибки на этапе разработки.

Обратите внимание, что в приведенном синтаксисе объект ResourceDictionary является неявным с точки зрения того, как процессор WPF XAML создает коллекцию для заполнения коллекции Resources. Обычно элемент ResourceDictionary не предоставляется явно как элемент в разметке, хотя в некоторых случаях может присутствовать для ясности (он будет являться элементом объекта коллекции между элементом свойства Resources и элементами, которые заполняют словарь). Сведения о том, почему объект коллекции почти всегда является неявным элементом в разметке, см. в разделе Подробное описание синтаксиса XAML.

В реализации XAML WPF обработка ключей словаря ресурсов определяется абстрактным классом ResourceKey. Тем не менее процессор WPF XAML создает различные типы базовых расширений для ключей в зависимости от их применения. Например, ключ для DataTemplate или любого производного класса обрабатывается отдельно и создается объект DataTemplateKey.

Ключи и имена используют различные директивы и языковые элементы (x:Key по сравнению с x:Name) в базовом определении XAML. Ключи и имена также используются в различных ситуациях определением WPF и приложением этих концепций. Дополнительные сведения см. в разделе Области видимости имен XAML в WPF.

Как уже указывалось ранее, значение ключа может предоставляться через расширение разметки и отличаться от строкового значения. Примером WPF-сценария является ситуация, в которой значением x:Key может быть ComponentResourceKey. Некоторые элементы управления предоставляют ключ стиля такого типа для пользовательского ресурса стиля, который частично изменяет внешний вид и поведение этого элемента управления без полной замены стиля. Примером такого ключа является ButtonStyleKey.

Функция объединенного словаря WPF представляет дополнительные соображения относительно поведения подстановки ключа и уникальности ключа. Дополнительные сведения см. в разделе Объединенные словари ресурсов.

XAML 2009

XAML 2009 ослабляет ограничение, которое заключается в том, что x:Key всегда предоставляется в виде атрибута.

В WPF можно использовать возможности XAML 2009, но только для кода XAML, который не является компилированной разметкой. XAML с компилированной разметкой для WPF и форма BAML кода XAML в настоящее время не поддерживают ключевые слова и возможности 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.

x:Key для Silverlight описывается отдельно. Дополнительные сведения см. в разделе Возможности пространства имен языка XAML (x:) (Silverlight).

См. также

Ссылки

Расширение разметки StaticResource

Основные понятия

Общие сведения о ресурсах

Ресурсы и код