Объединенные словари ресурсов
Ресурсы 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 должно быть в виде uniform resource identifier (URI), который разрешает путь к файлу ресурсов, подлежащих объединению. Местом назначения этого 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 объединенного словаря ресурса
Имеется несколько методов включения объединенного словаря ресурсов, обозначенных форматом uniform resource identifier (URI), которые можно использовать. В общем, эти методы можно разделить на две категории: ресурсы, которые компилируются как часть проекта, и ресурсы, которые не компилируются как часть проекта.
Для ресурсов, компилируемых как часть проекта, можно использовать относительный путь, который ссылается на расположение ресурса. Относительный путь вычисляется во время компиляции. Ресурс должен быть определен как часть проекта в качестве действия построения ресурса. Если включить XAML-файл ресурсов в проект как "Ресурс", то необязательно копировать файл ресурсов в выходной каталог, так как ресурс уже включен в скомпилированное приложение. Можно также использовать действие построения содержимого, но, при этом, необходимо скопировать файлы в выходной каталог, а также развернуть файлы ресурсов там же, где и исполняемый файл.
Примечание |
---|
Не используйте действие построения внедренного ресурса.Само действие построения поддерживается для приложений WPF, но разрешение источника Source не включает диспетчер ResourceManager и, таким образом, не поддерживает выделение отдельного ресурса из потока.Внедренный ресурс, тем не менее, можно использовать для других целей до тех пор, пока используется объект ResourceManager для доступа к ресурсам. |
Близкой методикой является использование пакета Pack URI в XAML-файле и ссылка на него в качестве источника. URI типа "pack" предоставляет ссылки на компоненты сборок, на которые имеются ссылки, и другие методы. Дополнительные сведения об URI типа "pack" см. в разделе Ресурсы, Содержимое и Файлы данных WPF-приложения.
Для ресурсов, не компилируемых как часть проекта, URI обрабатывается во время выполнения. Для указания ссылок на файл ресурса можно использовать общий транспорт URI, например file: или http:. К недостаткам подхода, использующего некомпилируемые ресурсы, относится то, что доступ типа file: требует дополнительных действий по развертыванию, а доступ http: предполагает использование зоны безопасности "Интернет".
Повторное использование объединенных словарей
Объединенные словари можно использовать повторно или скрывать к ним общий доступ приложений, поскольку на словарь ресурсов, предназначенный для слияния, можно ссылаться через любые допустимые uniform resource identifier (URI). То, как это будет происходить, зависит от стратегии развертывания приложения и от того, какая модель приложение выполняется. Вышеупомянутая стратегия Pack URI обеспечивает способ обращения к объединенному ресурсу в нескольких проектах во время разработки через совместное использование ссылки на сборку. В этом случае ресурсы по-прежнему распространяются клиентом, и по крайней мере одно из приложений должно развернуть сборку, для которой будут создаваться ссылки. Также можно ссылаться на объединенные ресурсы через распределенный URI, который использует протокол HTTP.
Запись объединенных словарей как локальных файлов приложения или в локальное общее хранилище является другим возможным скриптом развертывания объединенного словаря/приложения.
Локализация
Если ресурсы, которые необходимо локализовать, изолированы от словарей, объединенных в основные словари, и хранятся как свободные XAML, эти файлы могут быть локализованы отдельно. Этот способ является упрощенной альтернативой для локализации сопутствующих сборок ресурсов. Дополнительные сведения см. в разделе Общие сведения о глобализации и локализации WPF.