Расширение разметки 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

Стоимость Description
targetTypeName Имя открытого типа среды CLR, определенного в сборке ресурсов.
targetID Ключ для ресурса. При поиске ресурсов targetID будет аналогичен директиве x:Key ресурса.

Замечания

Как показано в приведенных выше примерах использования, использование расширения разметки {ComponentResourceKey} находится в двух местах:

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

  • Доступ к ресурсу темы из сборки при создании нового шаблона элемента управления, когда требуется использовать значения свойств, которые поступают из ресурсов, предоставляемых темами элемента управления.

Для ссылки на ресурсы компонентов, поступающие из тем, обычно рекомендуется использовать {DynamicResource}, а не {StaticResource}. Это показано в примерах использования. Использовать {DynamicResource} рекомендуется, так как сама тема может быть изменена пользователем. Если вам требуется ресурс компонента, который наиболее точно соответствует намерению автора элемента управления, для поддержки темы, необходимо сделать использование ссылки на ресурсы компонента динамическим.

TypeInTargetAssembly определяет тип, который существует в целевой сборке, где фактически определяется ресурс. ComponentResourceKey можно определить и использовать независимо от того, где определяется TypeInTargetAssembly, однако в конечном итоге необходимо разрешить тип с помощью сборок, на которые вы ссылаетесь.

Распространенный вариант использования ComponentResourceKey — определение ключей, которые затем предоставляются как элементы класса. В этом случае используется конструктор класса ComponentResourceKey, а не расширение разметки. Дополнительные сведения см в ComponentResourceKeyили разделе "Определение ключей для ресурсов темы" темы Общие сведения о создании элементов управления.

Как для установки ключей, так и для ссылки на ресурсы с ключами синтаксис атрибутов обычно используется для расширения разметки ComponentResourceKey.

Показанный компактный синтаксис зависит от сигнатуры конструктора ComponentResourceKey и использования позиционного параметра расширения разметки. Порядок, в котором заданы targetTypeName и targetID, имеет значение. Подробный синтаксис основывается на конструкторе ComponentResourceKey без параметров, а затем задает TypeInTargetAssembly и ResourceId аналогично истинному синтаксису атрибутов для элемента объекта. В подробном синтаксисе порядок задания свойств не имеет значения. Отношение и механизмы этих двух альтернативных вариантов (компактного и подробного) подробно описаны в разделе Расширения разметки и XAML WPF.

Технически значение для targetID может представлять собой любой объект — необязательно, чтобы это была строка. Однако наиболее распространенный вариант использования в WPF — выравнивание значения targetID с формами, которые являются строками, там, где такие строки допустимы в грамматике XamlName.

ComponentResourceKey можно использовать в синтаксисе элемента объекта. В этом случае для правильной инициализации расширения требуется указать значение обоих свойств TypeInTargetAssembly и ResourceId.

В реализации читателя XAML WPF обработка данного расширения разметки определяется классом ComponentResourceKey.

ComponentResourceKey является расширением разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется больше, чем простая настройка преобразователей типов на работу с определенными типами или свойствами. Все расширения разметки в XAML используют символы { и } в синтаксисе их атрибутов, который является соглашением, по которому обработчик XAML узнает, что расширение разметки должно обработать атрибут. Дополнительные сведения см. в разделе Расширения разметки и XAML WPF.

См. также