Поделиться через


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

Ресурсы 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 существующего потока ФАЙЛОВ 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".

См. также