Объединенные словари ресурсов
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 качестве корневого элемента.
Note
Можно определять ресурсы в 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, который будет использоваться. Вообще говоря, эти методы можно разделить на две категории: ресурсы, которые компилируются как часть проекта, и ресурсы, которые не компилируются как часть проекта.
Для ресурсов, которые компилируются как часть проекта, можно использовать относительный путь, ссылающийся на расположение ресурса. Относительный путь вычисляется во время компиляции. Ресурс должен быть определен как часть проекта в качестве действия сборки ресурса. Если XAML-файл ресурса включен в проект в качестве ресурса, то не нужно копировать этот файл ресурса в выходной каталог, так как ресурс уже включен в скомпилированное приложение. Можно также использовать действие сборки содержимого, но затем будет необходимо скопировать файлы в выходной каталог и развернуть эти файлы ресурсов по тому же пути, связанному с исполняемым файлом.
Note
Не используйте действие сборки внедренного ресурса. Само действие сборки поддерживается для 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.