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

Ресурсы Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) поддерживают функцию объединенных словарей ресурсов.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) resources support a merged resource dictionary feature. Эта функция обеспечивает способ определения части ресурсов приложения WPFWPF за пределами скомпилированного приложения XAMLXAML.This feature provides a way to define the resources portion of a WPFWPF application outside of the compiled XAMLXAML application. Затем ресурсы можно совместно использовать в приложениях; они также более удобно изолируются для локализации.Resources can then be shared across applications and are also more conveniently isolated for localization.

Общие сведения об объединенном словаре ресурсовIntroducing a Merged Resource Dictionary

Для представления на странице объединенного словаря ресурсов используйте в разметке следующий синтаксис.In markup, you use the following syntax to introduce a merged resource dictionary into a page:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

Обратите внимание ResourceDictionary , что элемент не имеет директивы x:Key, которая обычно требуется для всех элементов в коллекции ресурсов.Note that the ResourceDictionary element does not have an x:Key Directive, which is generally required for all items in a resource collection. Но еще ResourceDictionary одна ссылка MergedDictionaries в коллекции является особым случаем, зарезервированной для этого сценария объединенного словаря ресурсов.But another ResourceDictionary reference within the MergedDictionaries collection is a special case, reserved for this merged resource dictionary scenario. Объект ResourceDictionary , который представляет объединенный словарь ресурсов, не может иметь директиву x:Key.The ResourceDictionary that introduces a merged resource dictionary cannot have an x:Key Directive. Как правило, ResourceDictionary каждый MergedDictionaries в коллекции задает Source атрибут.Typically, each ResourceDictionary within the MergedDictionaries collection specifies a Source attribute. Значение Source должноуниверсальный идентификатор ресурса (URI)uniform resource identifier (URI) быть значением, которое разрешается в расположение объединяемого файла ресурсов.The value of Source should be a универсальный идентификатор ресурса (URI)uniform resource identifier (URI) that resolves to the location of the resources file to be merged. Целевой объект URIURI должен быть другим XAMLXAML файлом, в ResourceDictionary качестве корневого элемента.The destination of that URIURI must be another XAMLXAML file, with ResourceDictionary as its root element.

Примечание

Допускается определение ресурсов в ResourceDictionary , которые указываются в виде объединенного словаря, либо в качестве альтернативы указанию Source, либо в дополнение к любым ресурсам, включенным в указанный источник.It is legal to define resources within a ResourceDictionary that is specified as a merged dictionary, either as an alternative to specifying Source, or in addition to whatever resources are included from the specified source. Однако это не очень распространенный сценарий; основным сценарием для объединенных словарей является объединение ресурсов из внешних файлов.However, this is not a common scenario; the main scenario for merged dictionaries is to merge resources from external file locations. Если вы хотите указать ресурсы в разметке для страницы, обычно их следует определить в основном ResourceDictionary , а не в Объединенных словарях.If you want to specify resources within the markup for a page, you should typically define these in the main ResourceDictionary and not in the merged dictionaries.

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

Ресурсы в объединенном словаре занимают место в области поиска ресурсов сразу после области главного словаря ресурсов, в который они будут включены.Resources in a merged dictionary occupy a location in the resource lookup scope that is just after the scope of the main resource dictionary they are merged into. Хотя ключ ресурса должен быть уникальным в пределах каждого отдельного словаря, один и тот же ключ может встречаться несколько раз в наборе объединенных словарей.Although a resource key must be unique within any individual dictionary, a key can exist multiple times in a set of merged dictionaries. В этом случае возвращаемый ресурс будет поступать из последнего словаря, последовательно найденного в MergedDictionaries коллекции.In this case, the resource that is returned will come from the last dictionary found sequentially in the MergedDictionaries collection. Если коллекция была определена в XAMLXAML, порядок объединенных словарей в коллекции — это порядок элементов, указанный в разметке. MergedDictionariesIf the MergedDictionaries collection was defined in XAMLXAML, then the order of the merged dictionaries in the collection is the order of the elements as provided in the markup. Если ключ определен в главном словаре, а также в словаре, который был объединен, возвращаемый ресурс поступит из основного словаря.If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary. Эти правила поиска применяются одинаково для ссылок как на статические, так и на динамические ресурсы.These scoping rules apply equally for both static resource references and dynamic resource references.

Объединенные словари и кодMerged Dictionaries and Code

Объединенные словари могут быть добавлены в словарь Resources с помощью кода.Merged dictionaries can be added to a Resources dictionary through code. Изначально пустое ResourceDictionary значение по умолчанию, которое Resources существует для любого свойства, также имеет изначально MergedDictionaries пустое свойство коллекции по умолчанию.The default, initially empty ResourceDictionary that exists for any Resources property also has a default, initially empty MergedDictionaries collection property. Чтобы добавить Объединенный словарь с помощью кода, можно получить ResourceDictionaryссылку на требуемый Первичный объект, получить значение его MergedDictionaries свойства и Add вызвать для универсального Collection типа, содержащегося в MergedDictionaries.To add a merged dictionary through code, you obtain a reference to the desired primary ResourceDictionary, get its MergedDictionaries property value, and call Add on the generic Collection that is contained in MergedDictionaries. Добавляемый объект должен быть новым ResourceDictionary.The object you add must be a new ResourceDictionary. В коде Source свойство не задается.In code, you do not set the Source property. Вместо этого необходимо получить ResourceDictionary объект, либо создав его, либо загрузив его.Instead, you must obtain a ResourceDictionary object by either creating one or loading one. Один из способов ResourceDictionary загрузить существующий объект для вызова XamlReader.Load в существующем XAMLXAML файловом потоке XamlReader.Load с ResourceDictionary корнем, а затем присвоить возвращаемое значение ResourceDictionary.One way to load an existing ResourceDictionary to call XamlReader.Load on an existing XAMLXAML file stream that has a ResourceDictionary root, then casting the XamlReader.Load return value to ResourceDictionary.

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

Существует несколько методов включения объединенного словаря ресурсов, указываемого форматом универсальный идентификатор ресурса (URI)uniform resource identifier (URI), который будет использоваться.There are several techniques for how to include a merged resource dictionary, which are indicated by the универсальный идентификатор ресурса (URI)uniform resource identifier (URI) format that you will use. Вообще говоря, эти методы можно разделить на две категории: ресурсы, которые компилируются как часть проекта, и ресурсы, которые не компилируются как часть проекта.Broadly speaking, these techniques can be divided into two categories: resources that are compiled as part of the project, and resources that are not compiled as part of the project.

Для ресурсов, которые компилируются как часть проекта, можно использовать относительный путь, ссылающийся на расположение ресурса.For resources that are compiled as part of the project, you can use a relative path that refers to the resource location. Относительный путь вычисляется во время компиляции.The relative path is evaluated during compilation. Ресурс должен быть определен как часть проекта в качестве действия сборки ресурса.Your resource must be defined as part of the project as a Resource build action. Если XAML-файл ресурса включен в проект в качестве ресурса, то не нужно копировать этот файл ресурса в выходной каталог, так как ресурс уже включен в скомпилированное приложение.If you include a resource .xaml file in the project as Resource, you do not need to copy the resource file to the output directory, the resource is already included within the compiled application. Можно также использовать действие сборки содержимого, но затем будет необходимо скопировать файлы в выходной каталог и развернуть эти файлы ресурсов по тому же пути, связанному с исполняемым файлом.You can also use Content build action, but you must then copy the files to the output directory and also deploy the resource files in the same path relationship to the executable.

Примечание

Не используйте действие сборки внедренного ресурса.Do not use the Embedded Resource build action. Само действие сборки поддерживается для WPFWPF приложений, но Source разрешение не включает ResourceManagerи, таким способом, не может разделять отдельные ресурсы из потока.The build action itself is supported for WPFWPF applications, but the resolution of Source does not incorporate ResourceManager, and thus cannot separate the individual resource out of the stream. Внедренный ресурс по-прежнему можно использовать для других целей, пока вы также ResourceManager используете для доступа к ресурсам.You could still use Embedded Resource for other purposes so long as you also used ResourceManager to access the resources.

Близким методом являются использование URI типа pack в файле XAMLXAML и ссылка на него в качестве источника.A related technique is to use a Pack URI to a XAMLXAML file, and refer to it as Source. URI типа pack позволяет ссылки на компоненты связанных сборок и другие методы.Pack URI enables references to components of referenced assemblies and other techniques. Дополнительные сведения об URI типа pack см. в разделе Ресурсы, контент и файлы данных приложения WPF.For more information on Pack URIs, see WPF Application Resource, Content, and Data Files.

Для ресурсов, которые не компилируются как часть проекта, URI вычисляется во время выполнения.For resources that are not compiled as part of the project, the URI is evaluated at run time. Для ссылки на файл ресурсов можно использовать общий транспорт URI, такой как file: или http:.You can use a common URI transport such as file: or http: to refer to the resource file. Недостаток подхода с использованием некомпилированного ресурса заключается в том, что для доступа file: требуются дополнительные действия по развертыванию, а доступ http: подразумевает зону безопасности Интернета.The disadvantage of using the noncompiled resource approach is that file: access requires additional deployment steps, and http: access implies the Internet security zone.

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

Вы можете многократно или совместно использовать объединенные словари ресурсов в приложениях, поскольку на словарь ресурсов, предназначенный для слияния, можно ссылаться через любые допустимые универсальный идентификатор ресурса (URI)uniform resource identifier (URI).You can reuse or share merged resource dictionaries between applications, because the resource dictionary to merge can be referenced through any valid универсальный идентификатор ресурса (URI)uniform resource identifier (URI). Точный способ сделать это будет зависеть от стратегии развертывания приложения и используемой модели приложения.Exactly how you do this will depend on your application deployment strategy and which application model you follow. Вышеупомянутая стратегия URI типа pack обеспечивает способ совместного создания объединенного ресурса между несколькими проектами в процессе разработки путем совместного использования ссылки на сборку.The aforementioned Pack URI strategy provides a way to commonly source a merged resource across multiple projects during development by sharing an assembly reference. В этом сценарии ресурсы по-прежнему распространяются клиентом и по крайней мере одно из приложений должно разворачивать связанную сборку.In this scenario the resources are still distributed by the client, and at least one of the applications must deploy the referenced assembly. Можно также ссылаться на объединенные ресурсы с помощью распределенного URI, который использует протокол http.It is also possible to reference merged resources through a distributed URI that uses the http protocol.

Запись объединенных словарей как локальных файлов приложения или в локальное общее хранилище является другим возможным сценарием объединенного словаря или развертывания приложения.Writing merged dictionaries as local application files or to local shared storage is another possible merged dictionary / application deployment scenario.

ЛокализацияLocalization

Если ресурсы, которые необходимо локализовать, изолированы от словарей, объединенных в основные словари, и хранятся как свободные XAMLXAML, эти файлы можно локализовать отдельно.If resources that need to be localized are isolated to dictionaries that are merged into primary dictionaries, and kept as loose XAMLXAML, these files can be localized separately. Этот способ является упрощенной альтернативой для локализации вспомогательных сборок ресурсов.This technique is a lightweight alternative to localizing the satellite resource assemblies. Дополнительные сведения см. в статье Общие сведения о глобализации и локализации WPF.For details, see WPF Globalization and Localization Overview.

См. такжеSee also