Система управления ресурсами
Система управления ресурсами имеет функции времени сборки и времени выполнения. Во время сборки система создает индекс всех различных вариантов ресурсов, упакованных с помощью приложения. Этот индекс является индексом ресурсов пакета или PRI, а также включается в пакет приложения. Во время выполнения система обнаруживает параметры пользователя и компьютера, действующие, просматривает сведения в PRI и автоматически загружает ресурсы, которые лучше всего соответствуют этим параметрам.
Файл индекса ресурсов пакета (PRI)
Каждый пакет приложения должен содержать двоичный индекс ресурсов в приложении. Этот индекс создается во время сборки и содержится в одном или нескольких файлах индекса ресурсов пакета (PRI).
- Файл PRI содержит фактические строковые ресурсы и индексированные набор путей к файлам, ссылающиеся на различные файлы в пакете.
- Пакет обычно содержит один файл PRI на язык с именем resources.pri.
- Файл resources.pri в корне каждого пакета автоматически загружается при создании экземпляра ResourceManager .
- Файлы PRI можно создавать и дампать с помощью средства MakePRI.exe.
- Для типичной разработки приложений вам не потребуется MakePRI.exe, так как он уже интегрирован в рабочий процесс компиляции Visual Studio. И Visual Studio поддерживает редактирование файлов PRI в выделенном пользовательском интерфейсе. Однако ваши локалиизаторы и используемые средства могут полагаться на MakePRI.exe.
- Каждый файл PRI содержит именованную коллекцию ресурсов, называемую картой ресурсов. При загрузке файла PRI из пакета имя карты ресурсов проверяется на соответствие имени удостоверения пакета.
- Файлы PRI содержат только данные, поэтому они не используют формат переносимого исполняемого файла (PE). Они специально предназначены для использования только данных в качестве формата ресурсов для Windows. Они заменяют ресурсы, содержащиеся в библиотеках DLL в модели приложений Win32.
Доступ API UWP к ресурсам приложения
Основные функции (ResourceLoader)
Самый простой способ доступа к ресурсам приложения программным способом — использовать пространство имен Windows.ApplicationModel.Resources и класс ResourceLoader. ResourceLoader предоставляет базовый доступ к строковым ресурсам из набора файлов ресурсов, ссылочных библиотек или других пакетов.
Расширенные функциональные возможности (ResourceManager)
Класс ResourceManager (в пространстве имен Windows.ApplicationModel.Resources.Core) предоставляет дополнительные сведения о ресурсах, таких как перечисление и проверка. Это выходит за рамки того, что предоставляет класс ResourceLoader .
Объект NamedResource представляет отдельный логический ресурс с несколькими языками или другими квалифицированными вариантами. В нем описывается логическое представление ресурса или ресурса с строковым идентификатором ресурса, например Header1
именем файла ресурса, например logo.jpg
.
Ресурсы, доступные приложению, хранятся в иерархических коллекциях, к которым можно получить доступ с помощью объекта ResourceMap . Класс ResourceManager предоставляет доступ к различным экземплярам ResourceMap верхнего уровня, используемым приложением, которые соответствуют различным пакетам для приложения. Значение MainResourceMap соответствует карте ресурсов для текущего пакета приложения и исключает все пакеты платформы, на которые ссылается ссылка. Каждое resourceMap называется именем пакета, указанным в манифесте пакета. В объекте ResourceMap находятся поддеревы (см. раздел ResourceMap.GetSubtree), которые содержат объекты NamedResource. Поддерев обычно соответствует файлам ресурсов, содержащим ресурс. Дополнительные сведения см. в разделе "Локализация строк в манифесте пользовательского интерфейса и пакета приложения" и "Загрузка изображений" и ресурсов, адаптированных для масштабирования, темы, высокой контрастности и других.
Рассмотрим пример.
// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;
Обратите внимание , что идентификатор ресурса рассматривается как фрагмент универсального идентификатора ресурса (URI) семантики URI. Например, GetValue("Caption%20")
рассматривается как GetValue("Caption ")
. Не используйте "?" или "#" в идентификаторах ресурсов, так как они завершают оценку пути к ресурсу. Например, "MyResource?3" рассматривается как "MyResource".
ResourceManager не только поддерживает доступ к строковым ресурсам приложения, но и поддерживает возможность перечисления и проверки различных файловых ресурсов. Чтобы избежать конфликтов между файлами и другими ресурсами, исходящими из файла, индексированные пути к файлам находятся в зарезервированном поддереве ResourceMap "Файлы". Например, файл \Images\logo.png
соответствует имени Files/images/logo.png
ресурса.
API StorageFile прозрачно обрабатывают ссылки на файлы как ресурсы и подходят для типичных сценариев использования. ResourceManager следует использовать только для расширенных сценариев, например при переопределении текущего контекста.
ResourceContext
Кандидаты ресурсов выбираются на основе определенного ресурсаContext, который является коллекцией значений квалификатора ресурсов (язык, масштаб, контрастность и т. д.). Контекст по умолчанию использует текущую конфигурацию приложения для каждого значения квалификатора, если не переопределено. Например, такие ресурсы, как изображения, могут быть квалифицированы для масштабирования, которые различаются от одного монитора к другому и, следовательно, от одного представления приложения к другому. По этой причине каждое представление приложения имеет отдельный контекст по умолчанию. Контекст по умолчанию для данного представления можно получить с помощью ResourceContext.GetForCurrentView. Каждый раз, когда вы извлекаете кандидата ресурсов, необходимо передать экземпляр ResourceContext , чтобы получить наиболее подходящее значение для данного представления.