2008-12-03 12 views
217

Ich habe Ressourcen-Verzeichnis-Dateien (MenuTemplate.xaml, ButtonTemplate.xaml, usw.), die ich in mehreren separaten Anwendungen verwenden möchte. Ich könnte sie zu den Assemblys der Anwendungen hinzufügen, aber es ist besser, wenn ich diese Ressourcen in einer einzigen Assembly kompiliere und meine Anwendungen darauf verweisen, oder?ResourceDictionary in einer separaten Assembly

Nachdem die Ressourcenassembly erstellt wurde, wie kann ich sie in der App.xaml meiner Anwendungen verweisen? Derzeit verwende ich ResourceDictionary.MergedDictionaries, um die einzelnen Wörterbuchdateien zusammenzuführen. Wenn ich sie in einer Assembly habe, wie kann ich sie in XAML referenzieren?

+1

Dies kann ein Overkill sein, aber Sie können Ihre Ressourcen für den Export mit der hier beschriebenen Technik vorbereiten: https://alexfeinberg.wordpress.com/2015/08/16/safely-export-wpf-resources/. Der Hauptvorteil besteht darin, Probleme zu vermeiden, wenn mehrere Versionen der Ressourcen-Assembly in dieselbe App-Domäne geladen werden. – user195275

Antwort

312

Überprüfen Sie die pack URI syntax. Sie wollen etwas wie folgt aus:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/> 
+0

Was ist, wenn YourAssembly nicht im Anwendungspfad enthalten ist? – EngineerSpock

+0

@Engineer Spock: dann wird die CLR es nicht ohne Hilfe finden (nichts speziell mit WPF zu tun). Fügen Sie entweder Prüfpfade zu Ihrer * app.config * hinzu oder hängen Sie sie an 'AppDomain.AssemblyResolve' an, um die Assembly leichter zu finden. –

+1

Muss ich den Prüfpfad hinzufügen, wenn YourAssembly-Projekt auf derselben Ebene wie das Anwendungsprojekt ist, das YourAssembly referenzieren muss? Zum Beispiel C: \ Solution \ AppProject \ und C: \ Solution \ YourAssemblyProject \ – EngineerSpock

88

Ein Beispiel, um nur diese zu machen ein 15 Sekunden zu beantworten -

Sagen Sie „Styles.xaml“ in einer WPF-Bibliothek mit dem Namen „gemeinsam“ haben und die Sie verwenden möchten es von Ihrem Haupt-Anwendungsprojekt:

  1. einen Verweis aus dem Hauptprojekt zu „gemeinsamen“ Projekt
  2. sollte Ihre app.xaml enthalten:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Prost

+2

Und wie stellen Sie dann die in styles.xaml definierten Ressourcen über das Fenster Eigenschaften von Visual Studio 2010 zur Verfügung? Wenn ich ein Element auswähle und dann auf Ressource für seine Hintergrundeigenschaft anwenden klickt, werden nur Systemfarben und nicht die in styles.xaml definierten Farben angezeigt. Aber wenn ich den Ressourcennamen in XAML selbst schreibe, funktioniert es, also wird es korrekt referenziert. – xr280xr

+0

Ich wollte nur hinzufügen, dass wenn Sie das ResourceDictionary von UserControl referenzieren, müssen Sie einen Verweis auf die Assembly an beiden Orten hinzufügen: in der UserControl und im Hauptfenster Projekt. Andernfalls erhalten Sie den Laufzeitfehler. – Gattuso

15

Ressourcen-DLL ist eine Option für Sie. Dies ist jedoch nicht unbedingt erforderlich, es sei denn, Sie möchten Ressourcen ändern, ohne Anwendungen erneut zu kompilieren. Haben Sie nur eine gemeinsame ResourceDictionary-Datei ist auch eine Option. Es hängt davon ab, wie Sie oft Ressourcen ändern und usw.

<ResourceDictionary Source="pack://application:,,,/ 
    <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/> 

MyAssembly - gerade nennen Montage ohne Erweiterung

FolderStructureInAssembly - Wenn Sie Ihre Ressourcen in einer folde sind, Ordnerstruktur angeben

Wenn Sie tun dies, es ist besser, auf siteOfOrigin ebenso aufmerksam zu sein.

WPF unterstützt zwei Autoritäten: application: /// und siteoforigin: ///. Die Anwendung: /// authority identifiziert Anwendungsdatendateien, die zur Kompilierungszeit bekannt sind, einschließlich Ressourcen- und Inhaltsdateien. Die Website siteoforigin: /// identifiziert Herkunftsortdateien. Der Bereich jeder Behörde ist in der folgenden Abbildung dargestellt.

enter image description here

4

Mit XAML:

Wenn Sie die anderen assembly Struktur kennen und wollen den resources in C# Code, dann Code unten verwenden:

ResourceDictionary dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute); 
foreach (var item in dictionary.Values) 
{ 
    //operations 
} 

Ausgabe: Wenn wir ResourceDictionaryRD1.xaml des Projekts WpfControlLibrary1 in StackOverflowApp Projekt verwenden möchten.

Struktur der Projekte:

Structure of Projects

Ressourcen Wörterbuch: Resource Dictionary

Code Ausgang:

Output

PS: Alle ResourceDictionary Dateien sollten Build Action als 'Resource' oder 'Page'.

Verwendung von C#:

Wenn jemand die Lösung in rein C# -Code dann sehen meine this solution.

4

Für UWP will:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />