Объединенные словари ресурсов
Обновлен: Ноябрь 2007
Ресурсы Windows Presentation Foundation (WPF) поддерживают функцию объединенного словаря ресурсов. Этот компонент обеспечивает возможность определения части ресурсов приложения WPF за пределами скомпилированного кода XAML. После этого ресурсы могут совместно использоваться несколькими приложениями; кроме того, они удобно изолированы для локализации.
Представление объединенного словаря ресурсов
В разметке следует использовать следующий синтаксис для представления объединенного словаря ресурсов на странице:
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="myresourcedictionary.xaml"/>
<ResourceDictionary Source="myresourcedictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
Обратите внимание, что элемент ResourceDictionary не имеет атрибута Атрибут x:Key, который, как правило, необходим для всех элементов в коллекции ресурсов. При этом, другая ссылка ResourceDictionary в коллекции MergedDictionaries является особым случаем, зарезервированным для этого сценария объединенного словаря ресурсов. ResourceDictionary, представляющий объединенный словарь ресурсов, не может иметь атрибута Атрибут x:Key. Как правило, каждый объект ResourceDictionary в коллекции MergedDictionaries задает атрибут Source. Значение источника Source должно быть в виде URI (uniform resource identifier — универсальный код ресурса), который разрешает путь к файлу ресурсов, подлежащих объединению. Местом назначения этого URI должен быть другой файл XAML с объектом ResourceDictionary в качестве корневого элемента.
Примечание. |
---|
Можно определить ресурсы в объекте ResourceDictionary, указанном в качестве объединенного словаря либо как альтернативы установленного источника Source, либо в дополнение к любым ресурсам, поступающим из указанного источника. Однако это не типичный сценарий: основным сценарием для объединенных словарей является объединение ресурсов из внешнего файла. Если требуется указать ресурсы внутри разметки страницы, обычно следует определить их в главном словаре ResourceDictionary, а не в объединенных словарях. |
Режим объединенного словаря
Ресурсы в объединенном словаре занимают место в области поиска ресурсов, располагающейся сразу после области основного словаря ресурсов, в котором они объединены. Хотя ключ ресурса должен быть уникальным в пределах одного словаря, ключ может существовать несколько раз в наборе объединенных словарей. В таком случае, возвращаемый ресурс будет поступать из последнего словаря, последовательно найденного в коллекции MergedDictionaries. Если коллекция MergedDictionaries определена в XAML, то порядок объединенных словарей в коллекции соответствует порядку элементов в разметке. Если ключ определен в основном словаре, а также в объединенном словаре, то возвращаемый ресурс поступит из основного словаря. Эти правила поиска применяются одинаково, как для статических ссылок ресурса, так и для динамических.
Объединенные словари и программный код
Объединенные словари могут быть добавлены в словарь Resources с помощью программного кода. Стандартный изначально пустой словарь ResourceDictionary, существующий для любого свойства Resources, также имеет стандартное изначальное пустое свойство коллекции MergedDictionaries. Чтобы добавить объединенный словарь с помощью кода, следует получить ссылку на требуемый основной словарь ResourceDictionary, получить значение его свойства MergedDictionaries и вызвать метод Add для общей коллекции Collection, содержащейся в объекте MergedDictionaries. Добавляемый объект должен быть новым словарем ResourceDictionary. В коде не следует задавать значение свойства Source. Вместо этого необходимо получить объект ResourceDictionary через его создание или загрузку. Одним из способов загрузки существующего словаря ResourceDictionary является вызов метода XamlReader.Load для существующего файлового потока XAML, который имеет корень ResourceDictionary, а затем приведение возвращенного значения XamlReader.Load к ResourceDictionary.
Коды URI объединенного словаря ресурса
Имеется несколько методик включения объединенного словаря ресурсов, обозначенных форматом URI (uniform resource identifier — универсальный код ресурса), которые можно использовать. В общем, эти методики можно разделить на две категории: ресурсы, которые компилируются как часть проекта, и ресурсы, которые не компилируются как часть проекта.
Для ресурсов, компилируемых как часть проекта, можно использовать относительный путь, который ссылается на расположение ресурса. Относительный путь вычисляется во время компиляции. Ресурс должен быть определен как часть проекта в качестве действия построения ресурса. Если включить XAML-файл ресурсов в проект как «Ресурс», то необязательно копировать файл ресурсов в выходной каталог, так как ресурс уже включен в скомпилированное приложение. Можно также использовать действие построения содержимого, но, при этом, необходимо скопировать файлы в выходной каталог, а также развернуть файлы ресурсов там же, где и исполняемый файл.
Примечание. |
---|
Не используйте действие построения внедренного ресурса. Само действие построения поддерживается для приложений WPF, но разрешение источника Source не включает диспетчер ResourceManager и, таким образом, не поддерживает выделение отдельного ресурса из потока. Внедренный ресурс, тем не менее, можно использовать для других целей до тех пор, пока используется диспетчер ResourceManager для доступа к ресурсам. |
Близкой методикой является использование пакета Pack URI в XAML-файле и ссылка на него в качестве источника. Пакет Pack URI предоставляет ссылки на компоненты сборок, на которые имеются ссылки, и другие методы. Дополнительные сведения о пакетах Pack URI см. в разделе Ресурсы, содержимое и файлы данных для приложений Windows Presentation Foundation.
Для ресурсов, не компилируемых как часть проекта, URI обрабатывается во время выполнения. Для указания ссылок на файл ресурса можно использовать общий транспорт URI, например file: или http:. К недостаткам подхода, использующего некомпилируемые ресурсы, относится то, что доступ типа file: требует дополнительных действий по развертыванию, а доступ http: предполагает использование зоны безопасности «Интернет».
Повторное использование объединенных словарей
Объединенные словари можно использовать повторно или скрывать к ним общий доступ приложений, поскольку на словарь ресурсов, предназначенный для слияния, можно ссылаться через любые допустимые URI (uniform resource identifier — универсальный код ресурса). То, как это будет происходить, зависит от стратегии развертывания приложения и от того, какая модель приложение выполняется. Вышеупомянутая стратегия Pack URI обеспечивает способ обращения к объединенному ресурсу в нескольких проектах во время разработки через совместное использование ссылки на сборку. В этом случае ресурсы по-прежнему распространяются клиентом, и по крайней мере одно из приложений должно развернуть сборку, для которой будут создаваться ссылки. Также возможно ссылаться на объединенные ресурсы через распределенный URI, который использует протокол HTTP.
Запись объединенных словарей как локальных файлов приложения или в локальное общее хранилище является другим возможным сценарием развертывания объединенного словаря/приложения.
Локализация
Если ресурсы, которые необходимо локализовать, изолированы от словарей, объединенных в основные словари, и хранятся как свободные XAML, эти файлы могут быть локализованы отдельно. Этот способ является упрощенной альтернативой для локализации сопутствующих сборок ресурсов. Дополнительные сведения см. в разделе Общие сведения о глобализации и локализации WPF.
См. также
Основные понятия
Ресурсы, содержимое и файлы данных для приложений Windows Presentation Foundation