Share via


Zusammengeführte Ressourcenwörterbücher

Windows Presentation Foundation-Ressourcen (WPF-Ressourcen) unterstützen eine Funktion für zusammengeführte Ressourcenverzeichnisse. Diese Funktion bietet die Möglichkeit, den Ressourcenteil einer WPF-Anwendung außerhalb der kompilierten XAML-Anwendung zu definieren. Die Ressourcen können dann anwendungsübergreifend freigegeben werden und auch bequemer für die Lokalisierung isoliert werden.

Einführung in ein zusammengeführtes Ressourcenwörterbuch

Verwenden Sie in Markup folgende Syntax, um ein zusammengeführtes Ressourcenwörterbuch in eine Seite einzubinden:

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

Beachten Sie, dass das ResourceDictionary-Element keine x:Key-Anweisung enthält, die im Allgemeinen für alle Elemente in einer Ressourcensammlung erforderlich ist. Ein weiterer ResourceDictionary-Verweis innerhalb der MergedDictionaries-Auflistung ist jedoch ein Sonderfall, der für dieses Szenario eines zusammengeführten Ressourcenverzeichnisses reserviert ist. Das ResourceDictionary-Element, das ein zusammengeführtes Ressourcenverzeichnis einführt, kann keine x:Key-Anweisung enthalten. In der Regel gibt jedes ResourceDictionary in der MergedDictionaries-Auflistung ein Source-Attribut an. Der Wert von Source sollte ein URI (Uniform Resource Identifier) sein, der den Speicherort der zusammenzuführenden Ressourcendatei auflöst. Das Ziel dieses URI muss eine andere XAML-Datei mit dem Stammelement ResourceDictionary sein.

Hinweis

Es ist zulässig, Ressourcen in einem ResourceDictionary zu definieren, das als zusammengeführtes Verzeichnis angegeben ist, und zwar entweder als Alternative zur Angabe von Source oder zusätzlich zu den Ressourcen, die in der angegebenen Quelle enthalten sind. Das ist aber kein übliches Szenario. Das Hauptszenario für zusammengeführte Wörterbücher besteht in der Zusammenführung von Ressourcen aus externen Dateispeicherorten. Wenn Sie Ressourcen innerhalb des Markups für eine Seite angeben möchten, definieren Sie diese normalerweise im Haupt-ResourceDictionary und nicht in den zusammengeführten Verzeichnissen.

Verhalten von zusammengeführten Wörterbüchern

Ressourcen in einem zusammengeführten Wörterbuch belegen einen Speicherort im Ressourcensuchbereich, der sich direkt hinter dem Bereich des Hauptressourcenwörterbuchs befindet, in dem sie zusammengeführt werden. Obwohl ein Ressourcenschlüssel in einem einzelnen Wörterbuch eindeutig sein muss, kann ein Schlüssel in einem Satz von zusammengeführten Wörterbüchern mehrmals vorkommen. In diesem Fall stammt die zurückgegebene Ressource aus dem letzten Ressourcenverzeichnis, das in der Reihenfolge in der MergedDictionaries-Auflistung gefunden wurde. Wenn die MergedDictionaries-Auflistung in XAML definiert wurde, entspricht die Reihenfolge der zusammengeführten Ressourcenverzeichnisse in der Sammlung der Reihenfolge der im Markup angegebenen Elemente. Wenn ein Schlüssel sowohl im primären Wörterbuch als auch in einem zusammengeführten Wörterbuch definiert ist, stammt die zurückgegebene Ressource aus dem primären Wörterbuch. Diese Bereichsregeln gelten gleichermaßen für statische und dynamische Ressourcenverweise.

Zusammengeführte Wörterbücher und Code

Einem Resources-Wörterbuch können zusammengeführte Wörterbücher durch Code hinzugefügt werden. Das standardmäßige, ursprünglich leere ResourceDictionary, das für jede Resources-Eigenschaft vorhanden ist, weist auch eine standardmäßige, ursprünglich leere MergedDictionaries-Auflistungseigenschaft auf. Um ein zusammengeführtes Verzeichnis über Code hinzuzufügen, rufen Sie einen Verweis auf das gewünschte primäre ResourceDictionary ab. Anschließend rufen Sie dessen MergedDictionaries-Eigenschaftswert ab und rufen Add für die generische Collection auf, die in MergedDictionaries enthalten ist. Das Objekt, das Sie hinzufügen, muss ein neues ResourceDictionary sein. Im Code legen Sie die Source-Eigenschaft nicht fest. Stattdessen müssen Sie ein ResourceDictionary-Objekt erhalten, indem Sie eines erstellen oder laden. Eine Möglichkeit, ein vorhandenes ResourceDictionary zu laden, besteht darin, XamlReader.Load für einen vorhandenen XAML-Dateistream aufzurufen, der über einen ResourceDictionary-Stamm verfügt, und dann den Rückgabewert von XamlReader.Load in ResourceDictionary umzuwandeln.

URIs für zusammengeführte Ressourcenwörterbücher

Es stehen mehrere Techniken zur Einbindung eines zusammengeführten Ressourcenverzeichnisses zur Verfügung, die sich aus dem von Ihnen verwendeten URI-Format ableiten. Im Allgemeinen können diese Techniken in zwei Kategorien unterteilt werden: Ressourcen, die als Teil des Projekts kompiliert werden und Ressourcen, die nicht als Teil des Projekts kompiliert werden.

Bei Ressourcen, die als Teil des Projekts kompiliert werden, können Sie den relativen Pfad verwenden, der auf den Speicherort der Ressource verweist. Der relative Pfad wird während der Kompilierung ausgewertet. Die Ressource muss als Ressourcenbuildvorgang als Teil des Projekts definiert werden. Wenn Sie eine Ressourcen-.xaml-Datei im Projekt als Ressource einbinden, müssen Sie die Ressourcendatei nicht in das Ausgabeverzeichnis kopieren. Die Ressource ist bereits in der kompilierten Anwendung enthalten. Der Inhaltsbuildvorgang kann auch verwendet werden. Dann müssen Sie aber die Dateien in das Ausgabeverzeichnis kopieren. Außerdem müssen die Ressourcendateien in derselben Pfadbeziehung für die ausführbare Datei bereitgestellt werden.

Hinweis

Verwenden Sie nicht den Eingebettete-Ressource-Buildvorgang. Der Buildvorgang selbst wird für WPF-Anwendungen unterstützt, aber die Auflösung von Source schließt ResourceManager nicht mit ein und kann daher die einzelnen Ressourcen nicht aus dem Stream separieren. Sie können eingebettete Ressource weiterhin für andere Zwecke verwenden, sofern Sie auch ResourceManager für den Zugriff auf die Ressourcen verwenden.

Bei einer ähnlichen Methode wird ein Paket-URI für eine XAML-Datei verwendet, auf die dann als Quelle verwiesen wird. Ein Paket-URI ermöglicht Verweise auf Komponenten der Assemblys, auf die verwiesen wird, sowie andere Methoden. Weitere Informationen zu Paket-URIs finden Sie unter WPF-Anwendungsressource, Inhalts- und Datendateien.

Bei Ressourcen, die nicht als Teil des Projekts kompiliert werden, kann der URI zur Laufzeit ausgewertet werden. Sie können einen allgemeinen URI-Transport wie file: oder http: verwenden, um auf die Ressourcendatei zu verweisen. Der Nachteil beim Ansatz mit nicht kompilierten Ressourcen besteht darin, dass für file: zusätzliche Bereitstellungsschritte erforderlich werden und der http:-Zugriff die Internetsicherheitszone voraussetzt.

Wiederverwendung von zusammengeführten Wörterbüchern

Sie können zusammengeführte Ressourcenverzeichnisse wiederverwenden oder für andere Anwendungen freigeben, da mit jedem gültigen URI (Uniform Resource Identifier) auf das zusammenzuführende Ressourcenverzeichnis verwiesen werden kann. Der genaue Ablauf dieses Vorgangs hängt von der Bereitstellungsstrategie für Ihre Anwendung und dem verwendeten Anwendungsmodell ab. Die bereits erwähnte Paket-URI-Strategie bietet eine Möglichkeit, mit der Freigabe eines Assemblyverweises während der Entwicklung eine zusammengeführte Ressource für viele Projekte als häufige Quelle zu verwenden. In diesem Szenario werden die Ressourcen weiterhin durch den Client verteilt, und mindestens eine der Anwendungen muss die Assembly bereitstellen, auf die verwiesen wird. Es ist auch möglich, durch einen verteilten URI, der das HTTP-Protokoll verwendet, auf zusammengeführte Ressourcen zu verweisen.

Das Schreiben zusammengeführter Wörterbücher als lokale Anwendungsdateien ist ein weiteres mögliches Szenario für zusammengeführte Wörterbücher/Anwendungsbereitstellung.

Lokalisierung

Wenn Ressourcen, die lokalisiert werden müssen, in Verzeichnissen isoliert werden, die in primären Verzeichnissen zusammengeführt und als Loose XAML-Dateien gespeichert werden, ist eine separate Lokalisierung dieser Dateien möglich. Diese Technik stellt eine einfache Alternative zur Lokalisierung der Satellitenressourcenassemblys dar. Weitere Informationen finden Sie unter Übersicht über WPF-Globalisierung und -Lokalisierung.

Weitere Informationen