WPF Dynamische Änderung der Ressourcendatei und des Themas

8

Mein Projekt verwendet eine ProjectTheme.xaml-Datei für alle WPF-Fenster während des gesamten Projekts. Die ProjectTheme.xaml-Datei verweist auf ein Stilthema wie folgt

%Vor%

Alle WPF-Windows-Verweise auf WindowBase.xaml

%Vor%

WindowBase.xaml verweist auf die angepasste Titelleiste Bar1.xaml

%Vor%

Bar1.xaml verweist auf ProjectTheme.xaml

%Vor%

Also ist das Erbgut

  • Window1 verweist auf WindowBase.xaml
  • WindowBase verweist auf Bar1.xaml
  • Bar1 verweist auf ProjectTheme.xaml
  • ProjectTheme.xaml verweist auf die eigentliche Themenressourcendatei.

Das funktioniert gut. Jetzt möchte ich das Projektdesign zur Laufzeit dynamisch ändern, ohne die App zu beenden. Angenommen, ich habe mehrere Themenstildateien

  • Angepasst.xaml
  • Angepasst1.xaml
  • Customized2.xaml

Meine Frage ist wenn es möglich ist, die Datei ProjectTheme.xaml zur Laufzeit dynamisch zu aktualisieren, um die Zeile zu ändern von

%Vor%

bis

%Vor%

um mein Ziel zu erreichen? Wenn ja, wie mache ich das? Wenn nein, was ist der Grund und was ist der beste (andere) Weg, um meinen Zweck zu erreichen?

Ich habe Folgendes versucht, aber keiner von ihnen funktioniert: Der Stil ändert sich nicht.

Weg 1

%Vor%

Weg 2

%Vor%

Hinweis: In meinen echten Themenstildateien (Customized.xaml ...) habe ich eine Kombination aus dynamischer Ressource und statischer Ressource verwendet. Ist das wichtig?

Vielen Dank im Voraus.

    
Shawn 29.07.2013, 15:55
quelle

1 Antwort

13

Hier sind ein paar Dinge zu beachten.

Erstens wird alles, was mit StaticResource definiert wurde, bei einer Änderung nicht aktualisiert. Wenn Sie möchten, dass ein Steuerelement das Ändern des Designs zur Laufzeit unterstützt, müssen Sie DynamicResource verwenden, damit es nach Änderungen suchen kann.

Ihr Gesamtansatz zum Ändern des Themas ist korrekt. Der einfachste Weg, dies zu erreichen, ist die Verwendung von anwendungsspezifischen Ressourcen-Wörterbüchern , um sicherzustellen, dass Ihr ResourceDictionary ist in Ihrem App.xaml definiert. Zum Hinzufügen einer neuen Ressource habe ich ähnliche Snippets wie folgt verwendet:

%Vor%

Der Teil, mit dem Sie sich möglicherweise verwirren, ist, wenn Sie Ressourcen in Basisklassen verwenden. Wenn Sie eine Ressource in einer Klasse definieren, ist die Ressource für eine Instanz dieses Typs lokal. Stellen Sie sich das XAML-Compiling in seine eigene InitializeComponent() -Methode für Klassen vor, was bedeutet, dass Sie das ursprüngliche XAML nicht ändern können und erwarten, dass die Änderungen an alle Instanzen übertragen werden. Umgekehrt wirkt sich das Ändern der Ressourcen einer Klasseninstanz nicht auf andere Instanzen aus.

Da Ihre Frage eigentlich zwei separate Probleme enthält (Anwendung von Theming und Ändern von Kontrollressourcen), würde ich darauf achten, dass Ihre Anwendungsressourcen ordnungsgemäß aktualisiert werden und DynamicResource verwendet wird. Die von mir bereitgestellten Informationen wären hoffentlich zum Verständnis ausreichend warum bestimmte andere Ressourcen möglicherweise noch nicht aktualisiert werden.

    
Will Eddins 29.07.2013, 16:16
quelle

Tags und Links