Объединенные словари ресурсов

Ресурсы 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), который разрешает путь к файлу ресурсов для объединения. Назначением URI должен быть другой файл XAML, с ResourceDictionary в качестве корневого элемента.

Примечание.

Можно определять ресурсы в ResourceDictionary, который указан как объединенный словарь, либо в качестве альтернативы заданию Source, либо в дополнение к любым ресурсам, которые включаются из указанного источника. Однако это не очень распространенный сценарий; основным сценарием для объединенных словарей является объединение ресурсов из внешних файлов. Если требуется указать ресурсы в разметке страницы, обычно они определяются в главном словаре ResourceDictionary, а не в объединенных словарях.

Поведение объединенного словаря

Ресурсы в объединенном словаре занимают место в области поиска ресурсов сразу после области главного словаря ресурсов, в который они будут включены. Хотя ключ ресурса должен быть уникальным в пределах каждого отдельного словаря, один и тот же ключ может встречаться несколько раз в наборе объединенных словарей. В этом случае возвращаемый ресурс поступит из последнего словаря, последовательно найденного в коллекции MergedDictionaries. Если коллекция MergedDictionaries была определена в XAML, то порядок объединенных словарей в коллекции соответствует порядку элементов в разметке. Если ключ определен в главном словаре, а также в словаре, который был объединен, возвращаемый ресурс поступит из основного словаря. Эти правила поиска применяются одинаково для ссылок как на статические, так и на динамические ресурсы.

Объединенные словари и код

Объединенные словари могут быть добавлены в словарь Resources с помощью кода. Изначально пустой класс ResourceDictionary по умолчанию, который существует для каждого свойства Resources, также имеет изначально пустое свойство коллекции MergedDictionaries по умолчанию. Чтобы добавить объединенный словарь посредством кода, можно получить ссылку на нужный исходный ResourceDictionary, получить значение его свойства MergedDictionaries и вызвать метод Add в универсальном объекте Collection, который содержится в MergedDictionaries. Добавляемый объект должен представлять собой новый элемент ResourceDictionary. Не задавайте свойство Source в коде. Вместо этого необходимо получить объект ResourceDictionary путем его создания или загрузки. Один из способов загрузки существующего ResourceDictionary — вызов XamlReader.Load в существующем файловом потоке, который имеет корень ResourceDictionary, а затем приведение возвращаемого значения XamlReader.Load к ResourceDictionary.

URI объединенных словарей ресурсов

Существует несколько методов включения объединенного словаря ресурсов, указываемого форматом универсального кода ресурса (URI), который будет использоваться. Вообще говоря, эти методы можно разделить на две категории: ресурсы, которые компилируются как часть проекта, и ресурсы, которые не компилируются как часть проекта.

Для ресурсов, которые компилируются как часть проекта, можно использовать относительный путь, ссылающийся на расположение ресурса. Относительный путь вычисляется во время компиляции. Ресурс должен быть определен как часть проекта в качестве действия сборки ресурса. Если XAML-файл ресурса включен в проект в качестве ресурса, то не нужно копировать этот файл ресурса в выходной каталог, так как ресурс уже включен в скомпилированное приложение. Можно также использовать действие сборки содержимого, но затем будет необходимо скопировать файлы в выходной каталог и развернуть эти файлы ресурсов по тому же пути, связанному с исполняемым файлом.

Примечание.

Не используйте действие сборки внедренного ресурса. Само действие сборки поддерживается для приложений WPF, но разрешение Source не может включать ResourceManager, и поэтому невозможно выделение отдельного ресурса из потока. Внедренный ресурс по-прежнему можно использовать для других целей до тех пор, пока ResourceManager используется для доступа к ресурсам.

Близким методом являются использование URI типа pack в файле XAML и ссылка на него в качестве источника. URI типа pack позволяет ссылки на компоненты связанных сборок и другие методы. Дополнительные сведения об URI типа pack см. в разделе Ресурсы, контент и файлы данных приложения WPF.

Для ресурсов, которые не компилируются как часть проекта, URI вычисляется во время выполнения. Для ссылки на файл ресурсов можно использовать общий транспорт URI, такой как file: или http:. Недостаток подхода с использованием некомпилированного ресурса заключается в том, что для доступа file: требуются дополнительные действия по развертыванию, а доступ http: подразумевает зону безопасности Интернета.

Многократное использование объединенных словарей

Вы можете многократно или совместно использовать объединенные словари ресурсов в приложениях, поскольку на словарь ресурсов, предназначенный для слияния, можно ссылаться через любые допустимые универсальные коды ресурса (URI). Точный способ сделать это будет зависеть от стратегии развертывания приложения и используемой модели приложения. Вышеупомянутая стратегия URI типа pack обеспечивает способ совместного создания объединенного ресурса между несколькими проектами в процессе разработки путем совместного использования ссылки на сборку. В этом сценарии ресурсы по-прежнему распространяются клиентом и по крайней мере одно из приложений должно разворачивать связанную сборку. Можно также ссылаться на объединенные ресурсы с помощью распределенного URI, который использует протокол http.

Запись объединенных словарей как локальных файлов приложения или в локальное общее хранилище является другим возможным сценарием объединенного словаря или развертывания приложения.

Локализация

Если ресурсы, которые необходимо локализовать, изолированы от словарей, объединенных в основные словари, и хранятся как свободные XAML, эти файлы можно локализовать отдельно. Этот способ является упрощенной альтернативой для локализации вспомогательных сборок ресурсов. Дополнительные сведения см. в статье Общие сведения о глобализации и локализации WPF.

См. также