Zusammengeführte Ressourcenverzeichnisse (WPF .NET)

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.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

Erstellen eines zusammengeführten Ressourcenverzeichnisses

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-Sammlung ist jedoch ein Sonderfall, der für dieses Szenario eines zusammengeführten Ressourcenverzeichnisses reserviert ist. Außerdem kann das ResourceDictionary-Element, das ein zusammengeführtes Ressourcenverzeichnis einführt, keine x:Key-Anweisung enthalten.

In der Regel gibt jedes ResourceDictionary in der MergedDictionaries-Sammlung 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 jedoch kein häufiges Szenario. Das Hauptszenario für zusammengeführte Ressourcenverzeichnisse ist das Zusammenführen von Ressourcen aus externen Dateispeicherorten. Wenn Sie Ressourcen innerhalb des Markups für eine Seite angeben möchten, definieren Sie diese im Haupt-ResourceDictionary und nicht in den zusammengeführten Verzeichnissen.

Verhalten eines zusammengeführten Ressourcenverzeichnisses

Ressourcen in einem zusammengeführten Ressourcenverzeichnis belegen einen Speicherort im Ressourcensuchbereich, der sich direkt hinter dem Bereich des Hauptressourcenverzeichnisses 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-Sammlung gefunden wurde. Wenn die MergedDictionaries-Sammlung 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 Ressourcenverzeichnis als auch in einem zusammengeführten Verzeichnis definiert ist, stammt die zurückgegebene Ressource aus dem primären Verzeichnis. Diese Bereichsregeln gelten gleichermaßen für statische und dynamische Ressourcenverweise.

Zusammengeführte Verzeichnisse 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-Sammlungseigenschaft auf. Um ein zusammengeführtes Verzeichnis über Code hinzuzufügen, rufen Sie einen Verweis auf das gewünschte primäre ResourceDictionary ab, rufen 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 in ResourceDictionary umzuwandeln.

Zusammengeführte Verzeichnis-URIs

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 Buildvorgang Ressource als Teil des Projekts definiert werden. Wenn Sie eine XAML-Ressourcendatei als Ressource in das Projekt einbinden, müssen Sie die Ressourcendatei nicht in das Ausgabeverzeichnis kopieren. Die Ressource ist bereits in der kompilierten Anwendung enthalten. Sie können auch den Buildvorgang Inhalt verwenden. Dann müssen Sie jedoch die Dateien in das Ausgabeverzeichnis kopieren und auch die Ressourcendateien in derselben Pfadbeziehung für die ausführbare Datei bereitstellen.

Hinweis

Verwenden Sie nicht den Buildvorgang Eingebettete Ressource. 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, erfolgt die Auswertung des URIs zur Laufzeit. 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 der file:-Zugriff zusätzliche Bereitstellungsschritte erfordert und der http:-Zugriff die Internetsicherheitszone voraussetzt.

Wiederverwenden von zusammengeführten Verzeichnissen

Sie können zusammengeführte Ressourcenverzeichnisse wiederverwenden oder für andere Anwendungen freigeben, weil mit jedem gültigen Uniform Resource Identifier (URI) auf das zusammenzuführende Ressourcenverzeichnis verwiesen werden kann. Der genaue Ablauf dieses Vorgangs hängt von Ihrer Anwendungsbereitstellungsstrategie und dem von Ihnen verwendeten Anwendungsmodell ab. Die bereits erwähnte Paket-URI-Strategie bietet eine Möglichkeit, durch die gemeinsame Nutzung eines Assembyverweises eine zusammengeführte Ressource während der Entwicklung für mehrere Projekte gemeinsam zu nutzen. 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, über einen verteilten URI, der das http:-Protokoll verwendet, auf zusammengeführte Ressourcen zu verweisen.

Das Schreiben zusammengeführter Verzeichnisse als lokale Anwendungsdateien oder in den lokalen freigegebenen Speicher ist ein weiteres mögliches Szenario für zusammengeführte Verzeichnisse und Anwendungsbereitstellungen.

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