Statische Ressource, die in zusammengeführten Wörterbüchern freigegeben ist

8

Ich arbeite gerade daran, Wörterbücher für Stile und Vorlagen zu haben, die ich dynamisch auf meine Anwendung anwenden kann. Vor diesem "neuen gewollten" dynamischen Verhalten hatte ich mehrere Ressourcenwörterbücher, eines für jedes gestylte Steuerelement, das ich in der App.xaml zusammengeführt habe:

%Vor%

Nun möchte ich, dass meine Anwendung gestylt wird. Daher habe ich beschlossen, alle meine bisherigen Ressourcen in eine neue namens "MyFirstTemplates" zusammenzuführen und nur dieses Wörterbuch zur App.xaml hinzuzufügen.

Neues Wörterbuch "MyFirstTemplates.xaml":

%Vor%

Neue App.xaml:

%Vor%

Hinweis: Der Standardstil für das Fenster ist die Korrektur eines Fehlers von WPF 4, siehe Hinzufügen eines Merged Dictionary zu einem Merged Dictionary

Nachdem ich diese Änderung vorgenommen habe, kann ich eine Farbressource von "ColorsDictionary.xaml" nicht mehr als StaticResource in "ControlsTemplateDictionary.xaml" verwenden. Wenn ich diese Dateien in app.xaml wieder zusammenführe, funktioniert alles. Damit es funktioniert, muss ich diese StaticResource für DynamicResource ändern. Hast du eine Idee, warum das nicht mehr funktioniert?

Danke: -)

    
Antoine Jeanrichard 01.12.2010, 13:51
quelle

2 Antworten

7

Durch das Verschieben der Wörterbücher aus App.xaml werden die Ressourcen aus jedem Wörterbuch beim Laden von MyFirstTemplates.xaml nicht in den Ressourcenbaum des anderen Verzeichnisses verschoben. Ihr ursprüngliches Setup hat zuerst ColorsDictionary geladen, das dann während des Ladens über App-Ressourcen für ControlsTemplatesDictionary verfügbar war. Damit die Farbressource in App-Ressourcen verfügbar ist, muss sie in Ihrer neuen Einrichtung über MyFirstTemplates geladen werden, was wiederum das Laden beider Wörterbücher erfordert, was wiederum den Zugriff auf die Farbressource erfordert ... also ist es so eine Endlosschleife von Referenzen, die nicht statisch aufgelöst werden kann. DynamicResource kann warten, bis alles geladen ist und dann auf die Farbe ohne Problem zugreifen.

Um zu beheben, verwenden Sie entweder Dynamic oder fügen Sie ColorsDictionary direkt in ControlsTemplatesDictionary zusammen.

    
John Bowen 01.12.2010, 16:48
quelle
2

Tolle Antwort von John, die erklärt, warum das passiert. Das Problem besteht also darin, dass bei Verwendung von zusammengeführten Wörterbüchern in einem zusammengeführten Wörterbuch die inneren Wörterbücher sich nicht als StaticResource "verwenden" können.

Grundlegende Lösungen:

  • Verwenden Sie DynamicResource
  • Verwenden Sie nur eine einzelne Hierarchieebene von App.xaml, wenn Sie StaticResource verwenden

Beide Lösungen haben Probleme. DynamicResource hat ein Leistungsproblem. Die zweite Lösung beschränkt Sie darauf, wie Sie Ihre XAML-Ressourcen organisieren.

Alternative Lösung:

Ich habe ein kleines einfaches Programm (unten in GitHub) erstellt, das als Pre-Build-Event ausgeführt wird und XAML-Dateien aus einem Ordner in eine lange .XAML-Datei zusammenfügt. Nun, sie müssen mit einer anderen Erweiterung (.txaml) sein, sonst werden sie kompiliert.

Dies ermöglicht es, Ressourcenordner und -dateien beliebig zu strukturieren, ohne die Einschränkungen von WPF. StaticResource und der Designer werden immer funktionieren.

Der Code in GitHub enthält eine einfache Lösung, die das Merging-Programm enthält. Es führt 2 Ordner in 2 Dateien zusammen. Eine für App.xaml-Ressourcen und die andere für Generic.xaml-Ressourcen. Die .xaml-Dateien in einem "Controls" -Projekt (Es gibt auch "Main" -Projekt).

Blog-Post erklärt dies

    
Michael_S_ 22.01.2017 13:16
quelle