Объединенные словари ресурсов (WPF .NET)

Ресурсы Windows Presentation Foundation (WPF) поддерживают объединенную функцию словаря ресурсов. Эта функция позволяет определить часть ресурсов приложения WPF за пределами скомпилированного приложения XAML. Затем ресурсы можно совместно использовать в приложениях; они также более удобно изолируются для локализации.

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

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

Для представления на странице объединенного словаря ресурсов используйте в разметке следующий синтаксис.

<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 существующего потока ФАЙЛОВ XAML с ResourceDictionary корнем, а затем приведение возвращаемого значения ResourceDictionaryв .

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

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

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

Примечание.

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

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

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

Повторное использовать объединенные словари

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

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

Локализация

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

См. также