ResourceDictionary in einer separaten Assembly

245

Ich habe Ressourcenwörterbuchdateien (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?

Wie kann ich nach dem Erstellen der Ressourcenassembly in der App.xaml meiner Anwendungen darauf verweisen? Derzeit verwende ich ResourceDictionary.MergedDictionaries, um die einzelnen Wörterbuchdateien zusammenzuführen. Wie kann ich sie in xaml referenzieren, wenn ich sie in einer Assembly habe?

Gus Cavalcanti
quelle
1
Dies mag ein Overkill sein, aber Sie möchten möglicherweise Ihre Ressourcen für den Export mit der hier beschriebenen Technik vorbereiten: alexfeinberg.wordpress.com/2015/08/16/… . Dies hat den Hauptvorteil, dass Probleme mit mehreren Versionen der Ressourcenassembly, die in dieselbe Appdomain geladen werden, vermieden werden.
user195275

Antworten:

352

Überprüfen Sie die Pack-URI-Syntax . Sie wollen so etwas:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Kent Boogaart
quelle
1
Was ist, wenn YourAssembly nicht im Anwendungspfad enthalten ist?
SaneDeveloper
@Engineer Spock: dann wird die CLR es nicht ohne Hilfe finden (nichts spezielles mit WPF zu tun). Fügen Sie Ihrer app.config entweder Prüfpfade hinzu oder hängen Sie an AppDomain.AssemblyResolve, um die Assembly zu finden.
Kent Boogaart
1
Muss ich einen Prüfpfad hinzufügen, wenn sich Ihr YourAssembly-Projekt auf derselben Ebene befindet wie das Anwendungsprojekt, das auf YourAssembly verweisen muss? Zum Beispiel C: \ Solution \ AppProject \ und C: \ Solution \ YourAssemblyProject \
SaneDeveloper
1
@EngineerSpock: Dies ist eine separate Frage, bitte öffnen Sie eine.
Kent Boogaart
2
Diese Antwort macht keinen Sinn. Um ihm zu folgen, muss man bereits wissen, wie es geht!
user1040323
97

Ein Beispiel, um dies zu einer 15-Sekunden-Antwort zu machen -

Angenommen, Sie haben "styles.xaml" in einer WPF-Bibliothek mit dem Namen "common" und möchten diese aus Ihrem Hauptanwendungsprojekt verwenden:

  1. Fügen Sie eine Referenz aus dem Hauptprojekt zum "allgemeinen" Projekt hinzu
  2. Ihre app.xaml sollte enthalten:

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

Prost

Hertzel Guinness
quelle
2
Und wie stellen Sie dann die in styles.xaml definierten Ressourcen über das Visual Studio 2010-Eigenschaftenfenster zur Verfügung? Wenn ich ein Element auswähle und dann für seine Hintergrundeigenschaft auf Ressource anwenden klicke, werden nur SystemColors angezeigt und nicht die in styles.xaml definierten. Wenn ich den Ressourcennamen jedoch selbst in XAML eingebe, funktioniert er und wird korrekt referenziert.
xr280xr
Ich wollte nur hinzufügen, dass Sie, wenn Sie auf das ResourceDictionary von UserControl verweisen, an beiden Stellen einen Verweis auf die Assembly hinzufügen müssen: im UserControl und im Hauptfensterprojekt. Andernfalls wird der Laufzeitfehler angezeigt.
Andrejs Gasilovs
16

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

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

MyAssembly - Nur Baugruppenname ohne Erweiterung

FolderStructureInAssembly - Wenn sich Ihre Ressourcen in einer Folde befinden, geben Sie die Ordnerstruktur an

Wenn Sie dies tun, ist es besser, auch siteOfOrigin zu kennen.

WPF unterstützt zwei Behörden: application: /// und siteoforigin: ///. Die Berechtigung application: /// identifiziert Anwendungsdatendateien, die zur Kompilierungszeit bekannt sind, einschließlich Ressourcen- und Inhaltsdateien. Die Autorität siteoforigin: /// identifiziert Ursprungsortdateien. Der Umfang jeder Behörde ist in der folgenden Abbildung dargestellt.

Geben Sie hier die Bildbeschreibung ein

CharithJ
quelle
8

Für UWP:

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

Verwenden von XAML:

Wenn Sie die andere assemblyStruktur kennen und den resourcesin c # -Code möchten , verwenden Sie den folgenden Code:

 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 ResourceDictionary RD1.xamlProject WpfControlLibrary1in Project verwenden möchten StackOverflowApp.

Struktur der Projekte :

Struktur von Projekten

Ressourcenwörterbuch: Ressourcenwörterbuch

Code-Ausgabe:

Ausgabe

PS: Alle ResourceDictionaryDateien sollten Build Action' Resource' oder ' Page' haben.

Verwenden von C #:

Wenn jemand die Lösung in reinem C # -Code haben möchte, dann sehen Sie sich diese Lösung an.

Kylo Ren
quelle