Erstellen und Abrufen von Ressourcen in Windows Store-Apps
Das Betriebssystem Windows 8 stellt ein neues Ressourcenmodell für Windows Store-Apps vor, das das Nabe und Speiche-Modell ersetzt, das üblicherweise in .NET Framework-Desktop-Apps eingesetzt wird. In diesem Thema wird das neue Ressourcenmodell vorgestellt und erläutert, wie Ressourcen in Windows Store-Apps erstellt, bereitgestellt und abgerufen werden.
Ressourcen in Windows Store-Apps
.NET Framework-Desktop-Apps verwenden ein Nabe und Speiche-Modell zum Verpacken und Bereitstellen von Ressourcen. In der Regel werden Ressourcen für die neutrale Kultur der App (die Kultur, deren Ressourcen verwendet werden, wenn keine lokalisierten Ressourcen verfügbar sind) in die ausführbare Datei der Anwendung eingebettet. Lokalisierte Ressourcen für jede zusätzliche Kultur werden in einer eigenständigen Satellitenassembly eingebettet, die nur Ressourcen und keinen ausführbaren Code enthält.
Im Gegensatz dazu verwenden Windows Store-Apps eine einzelne Ressourcendatei. Diese Datei wird als Indexdatei der Paketressource (Package Ressource Index, PRI) bezeichnet und speichert die Ressourcen für alle Sprachen, Kulturen und Skalierungsfaktoren.
Wichtig
Ressourcenfallbackregeln bestimmen, welche Ressourcen geladen werden, wenn die lokalisierten Ressourcen für eine bestimmte Kultur oder die aktuelle Kultur nicht gefunden werden können.
In den Desktop-Apps können Sie entweder Textdateien oder XML-Dateien (.resx) verwenden, um Ressourcen zu erstellen. Mit dem Resource File Generator (Resgen.exe) können Sie diese Dateien in binäre Ressourcendateien kompilieren (.resources). Sie verwenden den Compiler, um die Ressourcen der neutralen Kultur in die Haupt-App-Assembly einzubetten, und den Assembly Linker (AL.exe) für die Einbettung aller anderen lokalisierten Ressourcen in Satellitenassemblys. Sie können einzelne Ressourcen dann über die System.Resources.ResourceManager-Klasse abrufen oder Ressourcen über die ResourceReader-Klasse auflisten.
In Windows Store-Apps verwenden Sie RESW-Dateien, um Ressourcen zu erstellen. Trotz der unterschiedlichen Dateierweiterung ist das RESW-Dateiformat mit dem RESX-Dateiformat identisch, außer dass RESW-Dateien möglicherweise nur Zeichenfolgen und Dateipfade enthalten. Mit den Ressourcen-Editoren von Visual Studio können Sie Ressourcen erstellen und bearbeiten. Zur Kompilierzeit werden alle RESW-Dateien für eine App vom MakePRI-Hilfsprogramm, das im Bereitstellungspaket der App enthalten ist, in eine einzelne PRI-Datei gepackt. Zur Laufzeit bieten die Windows.ApplicationModel.Resources.ResourceLoader-Klasse und die Typen im Windows.ApplicationModel.Resources.Core-Namespace Zugriff auf die App-Ressourcen.
Wichtig
Obwohl der Resource File Generator (Resgen.exe) primär für den Einsatz in Desktop-Apps gedacht ist, können Sie mit diesem Tool auch Satellitenassemblys in RESW-Dateien dekompilieren, die dann in eine PRI-Datei kompiliert werden können.
Warnung
Obwohl die System.Resources.ResourceManager-Klasse in .NET für Windows Store-Apps enthalten ist, empfehlen wird deren Verwendung nicht. Nutzen Sie ResourceManager nur in Bibliotheken, die als Portable Klassenbibliothek-Projekte entwickelt wurden und die auf mehrere Plattformen ausgerichtet sind.
Erstellen von Ressourcendateien
Die Ressourcen-Editoren von Visual Studio bieten die einfachste und bequemste Methode, eine RESW-Datei zu erstellen. Diese Editoren stellen eine Benutzeroberfläche bereit, die das zugrunde liegende XML-Dateiformat der RESW-Datei ausblendet. Das Erstellen und Bearbeiten von Ressourcendateien mit Visual Studio hat zwei wesentliche Vorteile:
Es ist nicht mehr notwendig, eine Ressourcendatei manuell zu generieren und sicherzustellen, dass das XML-Format gültig ist.
Es wird automatisch das MakePRI-Hilfsprogramm eingesetzt, um die Ressource zu kompilieren, in eine PRI-Datei zu packen und im Bereitstellungspaket der App einzuschließen.
Bei Desktop-Apps wird das NeutralResourcesLanguageAttribute-Attribut zum Definieren der neutrale Kultur der App eingesetzt. In Windows Store-Apps wird dieses Attribut ignoriert, wenn die PRI-Datei erstellt wurde und die ResourceLoader-Klasse von Windows zum Extrahieren von Ressourcen verwendet wird.
In Windows Store-App legen Sie die Namen von lokalisierten Ressourcendateien fest, indem Sie einen Ordner erstellen, um die Ressourcen und Images einer unterstützten Kultur zu speichern. Sie können dann die Ressource mittels des Kulturnamens (wie "ko-kr") gefolgt vom Standardressourcenamen und der Ressourcendateierweiterung beschreiben.
Bereitstellen von Ressourcendateien
Visual Studio behandelt alle Details der App-Bereitstellung für Ressourcendateien, die Teil eines Visual Studio-Projekts sind. Es generiert automatisch eine Konfigurationsdatei für alle Ressourcen, die Teil eines Projekts sind, verwendet das MakePRI-Tool, um die Ressourcen in einer einzelnen PRI-Datei einzuschließen und platziert die PRI-Datei im Bereitstellungspaket der App.
Da alle Ressourcen in einer einzelnen PRI-Datei enthalten sind und es keine Auflistung einzelner Dateien gibt, führt das Ändern einer vorhandenen Ressourcendatei oder das Hinzufügen einer Unterstützung für eine neue lokalisierte Kultur durch Hinzufügen einer Ressourcendatei dazu, dass die gesamte App neu erstellt und verteilt werden muss.
Abrufen von Ressourcen aus Ressourcendateien
Zum Abrufen von Ressourcen in einer Windows Store-App instanziieren Sie ein Windows-Runtime Windows.ApplicationModel.Resources.ResourceLoader-Objekt oder einen der Typen im Windows.ApplicationModel.Resources.Core-Namespace. Obwohl die System.Resources.ResourceManager-Klasse von .NET Framework in Windows Store-Apps unterstützt wird, sollten Sie diese nicht verwenden. Verwenden Sie ResourceManager nur, wenn Sie Portable Klassenbibliothek-Projekte entwickeln, die auf mehrere Plattformen ausgerichtet sind. In der folgenden Tabelle werden ResourceManager-Member und deren einfache Entsprechungen in den Windows.ApplicationModel.Resources.ResourceLoader-Klassen oder den Typen im Windows.ApplicationModel.Resources.Core-Namespace aufgeführt.
ResourceManager-Member |
Entsprechender Member von ResourceLoader oder anderer Windows-Runtime-Typ |
---|---|
Windows.ApplicationModel.Resources.ResourceLoader.GetString(String) |
|
Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue(String, ResourceContext) |
|
ResourceManager.ResourceManager(String, Assembly) |
Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader() - oder - Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(String) |
Das einfache Beispiel "Hello World"
Es folgt ein einfaches Beispiel einer Windows Store-App, das lokalisierte Zeichenfolgen anzeigt. Die neutrale Kultur ist russisch (Russische Föderation), enthält aber auch Ressourcen für die englischen (USA) und französischen (Frankreich) Kulturen. Wenn die Anwendung auf einem System ausgeführt wird, dessen aktuelle Kultur Englisch (Vereinigte Staaten) ist, wird sie einen Gruß auf Englisch anzeigen; anderenfalls auf Russisch. Schließlich verwendet sie unabhängig von der aktuellen Kultur die Windows.ApplicationModel.Resources.Core.ResourceContext- und Windows.ApplicationModel.Resources.Core.ResourceMap-Objekte, um einen Gruß auf Französisch anzuzeigen.
Um die Ausgabe für ein TextBlock-Steuerelement anzuzeigen, ist es bei diesem Beispiel erforderlich, das folgende <TextBlock>-Tag zu BlankPage.xaml hinzuzufügen:
<Grid Background="{StaticResource PageBackgroundBrush}"> <TextBlock x:Name="outputBlock" /> </Grid>
Der Anwendungscode wird dann vom BlankPage-Klassenkonstruktor wie folgt aufgerufen:
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Example.Run(outputBlock)
End Sub
public BlankPage()
{
InitializeComponent();
Example.Run(outputBlock);
}
Das Beispiel macht es erforderlich, die folgenden Ressourcen zu erstellen:
Eine russische Sprachressource namens "Greeting" mit dem Wert "Привет!". Die Zeichenfolge muss auf Stammebene des Projekts zu einer Ressourcendatei namens Resources.resw hinzugefügt werden.
Eine englische Sprachressource namens "Greeting" mit dem Wert "Hi there!". Fügen Sie zum Erstellen der Ressourcendatei einen Ordner mit der Bezeichnung de-DE zum Projekt hinzu, und fügen Sie dann eine Ressourcendatei namens "Resources.resw" zum Ordner hinzu.
Eine französische Sprachressource namens "Greeting" mit dem Wert "Bonjour!". Fügen Sie zum Erstellen der Ressourcendatei einen Ordner mit der Bezeichnung fr-FR zum Projekt hinzu, und fügen Sie dann eine Ressourcendatei namens "Resources.resw" zum Ordner hinzu.
Im folgenden Beispiel werden die entsprechenden lokalisierten Zeichenfolgen im TextBlock-Steuerelement angezeigt.
Imports System.Globalization
Imports Windows.ApplicationModel.Resources
Imports Windows.ApplicationModel.Resources.Core
Imports Windows.UI.Xaml.Controls
Public Class Example
Public Shared Sub Run(outputBlock As Windows.UI.Xaml.Controls.TextBlock)
outputBlock.Text += String.Format("{1}The current culture is {0}.{1}",
CultureInfo.CurrentCulture.Name, vbCrLf)
Dim rl As ResourceLoader = New ResourceLoader()
' Display greeting using the resources of the current culture.
Dim greeting As String = rl.GetString("Greeting")
outputBlock.Text += String.Format("{0}{1}",
If(String.IsNullOrEmpty(greeting), "Здрауствуйте", greeting),
vbCrLf)
' Display greeting using fr-FR resources.
Dim ctx As ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {"fr-FR"}
Dim rmap As ResourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources")
Dim newGreeting As String = rmap.GetValue("Greeting", ctx).ToString()
outputBlock.Text += String.Format("{1}{1}Culture of Current Context: {0}{1}",
ctx.Languages(0), vbCrLf)
outputBlock.Text += String.Format("{0}{1}", If(String.IsNullOrEmpty(newGreeting),
greeting, newGreeting), vbCrLf)
End Sub
End Class
using System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
using Windows.UI.Xaml.Controls;
public class Example
{
public static void Run(Windows.UI.Xaml.Controls.TextBlock outputBlock)
{
outputBlock.Text += String.Format("\nThe current culture is {0}.\n", CultureInfo.CurrentCulture.Name);
ResourceLoader rl = new ResourceLoader();
// Display greeting using the resources of the current culture.
string greeting = rl.GetString("Greeting");
outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(greeting) ? "Здрауствуйте" : greeting);
// Display greeting using fr-FR resources.
ResourceContext ctx = new Windows.ApplicationModel.Resources.Core.ResourceContext();
ctx.Languages = new string[] { "fr-FR" } ;
ResourceMap rmap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
string newGreeting = rmap.GetValue("Greeting", ctx).ToString();
outputBlock.Text += String.Format("\n\nCulture of Current Context: {0}\n", ctx.Languages[0]);
outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(newGreeting) ? greeting : newGreeting);
}
}
Wenn Sie die Anwendung kompilieren und ausführen, sieht die Ausgabe auf einem System mit der Kultur de-DE in etwa wie folgt aus:
The current culture is en-US. Hi there! Culture of Current Context: fr-FR Bonjour!
Siehe auch
Referenz
Visual Studio-Ressourcen-Editoren