Laden...

Wie kann ich StaticResourcen zur Laufzeit aktualisieren?

Erstellt von ByteDevil vor 3 Jahren Letzter Beitrag vor 3 Jahren 525 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 3 Jahren
Wie kann ich StaticResourcen zur Laufzeit aktualisieren?

Hallo,

der Titel klingt etwas komisch, ich weiß. Ich habe eine relativ große Anwendung die Verschiedene Themes unterstützt. Es gibt ein ResourceDictionary das sämtliche Styles und Templates beinhaltet. Dieses bindet dann ein weiteres ResourceDictionary in sich ein, wo die Farbcodes hinterlegt sind. Davon gibt es halt für jedes Theme eines. Möchte ich das Theme ändern, erzeuge ich das ResourceDictionary mit den Styles und Templates und packe dann das mit den gewünschten Farbcodes rein und weise es den Window.Resources zu. Möchte ich nun auf Farbwerte von aussen zugreifen, mache ich das mit DynamicResource, weil ich sonst die falsche Farbe kriege nachdem sich das Theme geändert hat.
Das funktioniert auch gut, nur habe ich jetzt ein solches DynamicResource in einem DataTemplate einer ListBox verwendet. Hier filtere ich die Items die angezeigt werden sollen mit einer Textbox in Echtzeit. Das ist unerträglich langsam wenn ich DynamicResource verwende...ersetze ich es durch ein StaticResource, funktioniert es tadellos.

Nun meine Frage: Im Moment wird jedes mal ein lookup nach diesem Farbwert vorgenommen, weil WPF ja davon ausgehen muss, dass sich diese DynamicResource jeder Zeit geändert haben kann. Tatsächlich möchte ich lieber StaticResource nutzen und WPF an einer einzigen Stelle sagen "Ruf mal bitte alle StaticResources neu ab" weil es sich nur ganz selten ändert. Geht das irgendwie? Wenn ich das nicht hinkriege, muss ich wohl oder übel die Farbe in meinem ViewModel für diesen speziellen Fall einmal abrufen und dann binden...ungern.

2.079 Beiträge seit 2012
vor 3 Jahren

Ohne eine direkte Antwort zu haben:

Hast Du Mal einen BindingProxy ausprobiert?
Der BindingProxy bindet an die Ressource und deine Items an den BindingProxy.

Ich weiß nicht, wie sich das mit dem Aktualisieren verhält, allerdings hättest Du da dann auch einen Anlaufpunkt, wo Du zentral aktualisieren kannst.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 3 Jahren

Vielen Dank für den Tipp. Ich stelle meine Nachforschungen aber nun ein. Wir haben aus anderen Gründen nun von .Net Framework 4.7 auf 4.8 migriert. Hier ist das Problem nicht mehr vorhanden. Das verwenden von DynamicResource hat keinen spürbaren Einfluss mehr. Offenbar hat MS da nochmal was verbessert.

2.079 Beiträge seit 2012
vor 3 Jahren

Bevor Du jetzt im großen Stil damit arbeitest: Miss lieber nach, ob es wirklich keinen Unterschied macht.
Wäre doof, wenn Ihr in ein paar Monaten/Jahren fest stellt, dass bei zunehmenden Datenmengen die oft genutzte DynamicResource doch einen Unterschied macht.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.