Ressourcenverwaltungssystem

Das Ressourcenverwaltungssystem verfügt sowohl über Build- als auch Laufzeitfeatures. Zur Buildzeit erstellt das System einen Index aller verschiedenen Varianten der Ressourcen, die mit Ihrer App gepackt sind. Dieser Index ist der Paketressourcenindex (PRI) und ist auch im Paket Ihrer App enthalten. Zur Laufzeit erkennt das System die tatsächlichen Benutzer- und Computereinstellungen, liest die Informationen im PRI ab 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 Buildzeit erstellt und ist in mindestens einer Pri-Datei (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.exeerstellt und gespeichert werden.
  • Für die typische App-Entwicklung benötigen Sie keine MakePRI.exe, da sie bereits in den Kompilierungsworkflow von Visual Studio integriert ist. Außerdem unterstützt Visual Studio das Bearbeiten von PRI-Dateien auf einer dedizierten Benutzeroberfläche. Ihre Lokalisierungsmodule und die von ihnen verwendeten Tools können jedoch von MakePRI.exe abhängig sein.
  • Jede PRI-Datei enthält eine benannte Auflistung von Ressourcen, die als Ressourcenzuordnung bezeichnet wird. Wenn eine PRI-Datei aus einem Paket geladen wird, wird der Ressourcenzuordnungsname überprüft, um dem Namen der Paketidentität zu entsprechen.
  • PRI-Dateien enthalten nur Daten, sodass sie nicht das PE-Format (Portable Executable) verwenden. Sie sind speziell für Daten als Ressourcenformat für Windows konzipiert. 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, ist die Verwendung des Windows.ApplicationModel.Resources-Namespaces und der ResourceLoader-Klasse . ResourceLoader bietet Ihnen einfachen Zugriff auf Zeichenfolgenressourcen aus dem Satz von Ressourcendateien, Bibliotheken, auf die verwiesen wird, oder aus anderen Paketen.

Erweiterte Funktionalität (ResourceManager)

Die ResourceManager-Klasse (im Windows.ApplicationModel.Resources.Core-Namespace ) stellt zusätzliche Informationen zu Ressourcen bereit, z. B. Enumeration und Überprüfung. Dies geht über das hinaus, was die ResourceLoader-Klasse bietet.

Ein NamedResource-Objekt stellt eine einzelne logische Ressource mit mehreren Sprachen oder anderen qualifizierten Varianten dar. Sie beschreibt die logische Ansicht des Ressourcenobjekts oder der Ressource mit einem Zeichenfolgenressourcenbezeichner wie Header1, 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 spezifisch für die Skalierungsauflösung 100 ist.

Für eine App verfügbare Ressourcen 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 der obersten Ebene, die von der App verwendet werden, die den verschiedenen Paketen für die App entsprechen. Der MainResourceMap-Wert entspricht der Ressourcenzuordnung für das aktuelle App-Paket und schließt alle Frameworkpakete aus, auf die verwiesen wird. Jede ResourceMap wird nach dem Paketnamen benannt, der im Manifest des Pakets angegeben ist. Innerhalb einer ResourceMap befinden sich 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 von Bildern und Ressourcen, die auf Skalierung, Design, hohen Kontrast und andere zugeschnitten sind.

Hier 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 je nach URI-Semantik als URI-Fragment (Uniform Resource Identifier) behandelt. Wird z. GetValue("Caption%20") B. als GetValue("Caption ")behandelt. Verwenden Sie "?" oder "#" nicht in Ressourcenbezeichnern, da sie die Ressourcenpfadauswertung beenden. Beispielsweise wird "MyResource?3" als "MyResource" behandelt.

Der ResourceManager unterstützt nicht nur den Zugriff auf die Zeichenfolgenressourcen einer App, es behält auch die Möglichkeit, die verschiedenen Dateiressourcen aufzulisten und zu überprüfen. Um Konflikte zwischen Dateien und anderen Ressourcen zu vermeiden, die aus einer Datei stammen, befinden sich indizierte Dateipfade alle in einer reservierten ResourceMap-Unterstruktur "Files". Die Datei \Images\logo.png entspricht beispielsweise dem Ressourcennamen Files/images/logo.png.

Die StorageFile-APIs behandeln Verweise auf Dateien transparent als Ressourcen und sind für typische Verwendungsszenarien geeignet. Der ResourceManager sollte nur für erweiterte Szenarien verwendet werden, z. B. wenn Sie den aktuellen Kontext überschreiben möchten.

ResourceContext

Ressourcenkandidaten werden basierend auf einem bestimmten ResourceContext ausgewählt, bei dem es sich um eine Sammlung von Ressourcenqualifizierern (Sprache, Skalierung, Kontrast usw.) handelt. Ein Standardkontext verwendet die aktuelle Konfiguration der App für jeden Qualifiziererwert, sofern er nicht überschrieben wird. Beispielsweise können Ressourcen wie Bilder für die Skalierung qualifiziert werden, die von einem Monitor zum anderen und damit von einer Anwendungssicht zur anderen variiert. Aus diesem Grund verfügt jede Anwendungsansicht über einen eigenen Standardkontext. Der Standardkontext für eine bestimmte Ansicht kann mithilfe von ResourceContext.GetForCurrentView abgerufen werden. Wenn Sie einen Ressourcenkandidaten abrufen, sollten Sie einen ResourceContext-instance übergeben, um den am besten geeigneten Wert für eine bestimmte Ansicht abzurufen.

Wichtige APIs