Ressourcenverwaltungssystem
Das Ressourcenverwaltungssystem verfügt sowohl über Buildzeit- als auch Laufzeitfeatures. Zur Erstellungszeit erstellt das System einen Index aller verschiedenen Varianten der Ressourcen, die mit Ihrer App verpackt sind. Dieser Index ist der Paketressourcenindex oder PRI und ist auch im Paket Ihrer App enthalten. Zur Laufzeit erkennt das System die tatsächlichen Benutzer- und Computereinstellungen, konsultiert die Informationen im PRI und lädt automatisch die Ressourcen, die für diese Einstellungen am besten geeignet sind.
Pri-Datei (Package Resource Index)
Jedes App-Paket sollte einen binären Index der Ressourcen in der App enthalten. Dieser Index wird zur Erstellungszeit erstellt und ist in einer oder mehreren PRI-Dateien (Package Resource Index) enthalten.
- Eine PRI-Datei enthält tatsächliche Zeichenfolgenressourcen und einen indizierten Satz von Dateipfaden, die auf verschiedene Dateien im Paket verweisen.
- Ein Paket enthält in der Regel eine einzelne PRI-Datei pro Sprache mit dem Namen "resources.pri".
- Die Datei "resources.pri" im Stammverzeichnis jedes Pakets wird automatisch geladen, wenn der ResourceManager instanziiert wird.
- PRI-Dateien können mit dem Tool MakePRI.exe erstellt und gesichert werden.
- Für die typische App-Entwicklung benötigen Sie keine MakePRI.exe, da sie bereits in den Visual Studio-Kompilierungsworkflow integriert ist. Und Visual Studio unterstützt das Bearbeiten von PRI-Dateien in einer dedizierten Benutzeroberfläche. Ihre Lokalisierer und die verwendeten Tools können sich jedoch auf MakePRI.exe verlassen.
- Jede PRI-Datei enthält eine benannte Sammlung von Ressourcen, die als Ressourcenzuordnung bezeichnet werden. Wenn eine PRI-Datei aus einem Paket geladen wird, wird der Ressourcenzuordnungsname überprüft, um dem Paketidentitätsnamen zu entsprechen.
- PRI-Dateien enthalten nur Daten, sodass sie das portable ausführbare Format (PE) nicht verwenden. Sie sind speziell darauf ausgelegt, datengeschützt als Ressourcenformat für Windows zu sein. Sie ersetzen Ressourcen, die in DLLs im Win32-App-Modell enthalten sind.
UWP-API-Zugriff auf App-Ressourcen
Grundlegende Funktionalität (ResourceLoader)
Die einfachste Möglichkeit, programmgesteuert auf Ihre App-Ressourcen zuzugreifen, besteht darin, den Windows.ApplicationModel.Resources-Namespace und die ResourceLoader-Klasse zu verwenden. ResourceLoader bietet einfachen Zugriff auf Zeichenfolgenressourcen aus der Gruppe von Ressourcendateien, referenzierten Bibliotheken oder anderen Paketen.
Erweiterte Funktionalität (ResourceManager)
Die ResourceManager-Klasse (im Windows.ApplicationModel.Resources.Core-Namespace) enthält zusätzliche Informationen zu Ressourcen, z. B. Enumeration und Inspektion. Dies geht darüber hinaus, was die ResourceLoader-Klasse bereitstellt.
Ein NamedResource -Objekt stellt eine einzelne logische Ressource mit mehreren Sprachen oder anderen qualifizierten Varianten dar. Es beschreibt die logische Ansicht der Ressource oder Ressource mit einem Zeichenfolgenressourcenbezeichner wie Header1
z. B. oder einem Ressourcendateinamen wie logo.jpg
.
Ein ResourceCandidate -Objekt stellt einen einzelnen konkreten Ressourcenwert und seine Qualifizierer dar, z. B. die Zeichenfolge "Hallo Welt" für Englisch oder "logo.scale-100.jpg" als qualifizierte Bildressource, die für die Skalierungsauflösung 100 spezifisch ist.
Ressourcen, die für eine App verfügbar sind, werden in hierarchischen Sammlungen gespeichert, auf die Sie mit einem ResourceMap-Objekt zugreifen können. Die ResourceManager-Klasse bietet Zugriff auf die verschiedenen ResourceMap-Instanzen auf oberster Ebene, die von der App verwendet werden, die den verschiedenen Paketen für die App entsprechen. Der Wert "MainResourceMap " entspricht der Ressourcenzuordnung für das aktuelle App-Paket und schließt alle referenzierten Frameworkpakete aus. Jede ResourceMap wird nach dem Paketnamen benannt, der im Manifest des Pakets angegeben ist. Innerhalb einer ResourceMap sind Unterstrukturen (siehe ResourceMap.GetSubtree), die weitere NamedResource-Objekte enthalten. Die Unterstrukturen entsprechen in der Regel den Ressourcendateien, die die Ressource enthalten. Weitere Informationen finden Sie unter Lokalisieren von Zeichenfolgen in Ihrem UI- und App-Paketmanifest und laden Sie Bilder und Ressourcen, die auf Skalierung, Design, hohen Kontrast und andere zugeschnitten sind.
Im Folgenden sehen Sie ein Beispiel.
// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;
Hinweis : Der Ressourcenbezeichner wird als URI-Fragment (Uniform Resource Identifier) behandelt, vorbehaltlich der URI-Semantik. Beispiel: GetValue("Caption%20")
wird als GetValue("Caption ")
. Verwenden Sie "?" oder "#" nicht in Ressourcenbezeichnern, da sie die Auswertung des Ressourcenpfads beenden. Beispielsweise wird "MyResource?3" als "MyResource" behandelt.
Der ResourceManager unterstützt nicht nur den Zugriff auf die Zeichenfolgenressourcen einer App, es verwaltet auch die Möglichkeit, die verschiedenen Dateiressourcen auflisten und zu überprüfen. Um Konflikte zwischen Dateien und anderen Ressourcen zu vermeiden, die aus einer Datei stammen, befinden sich alle indizierten Dateipfade in einer reservierten "Files" -ResourceMap-Unterstruktur . Die Datei \Images\logo.png
entspricht z. B. dem Ressourcennamen Files/images/logo.png
.
Die StorageFile-APIs behandeln Verweise auf Dateien als Ressourcen transparent und eignen sich für typische Verwendungsszenarien. Der ResourceManager sollte nur für erweiterte Szenarien verwendet werden, z. B. wenn Sie den aktuellen Kontext außer Kraft setzen möchten.
ResourceContext
Ressourcenkandidaten werden basierend auf einem bestimmten ResourceContext ausgewählt, bei dem es sich um eine Sammlung von Ressourcenqualifiziererwerten (Sprache, Skalierung, Kontrast usw.) handelt. Ein Standardkontext verwendet die aktuelle Konfiguration der App für jeden Qualifiziererwert, es sei denn, er wird überschrieben. Beispielsweise können Ressourcen wie Bilder für die Skalierung qualifiziert werden, die von einem Monitor zu einem anderen und somit von einer Anwendungsansicht zu einer anderen variieren. Aus diesem Grund verfügt jede Anwendungsansicht über einen eindeutigen Standardkontext. Der Standardkontext für eine bestimmte Ansicht kann mithilfe von ResourceContext.GetForCurrentView abgerufen werden. Immer wenn Sie einen Ressourcenkandidaten abrufen, sollten Sie eine ResourceContext-Instanz übergeben, um den für eine bestimmte Ansicht am besten geeigneten Wert zu erhalten.