WPF StaticResource funktioniert, DynamicResource nicht
Ich habe versucht, für einen Tag zu kaufen, ohne Erfolg, erstellen Sie ein Bündel von Pinseln in der das Thema dann mit Ihnen mit DynamicResource in einem benutzerdefinierten Steuerelement. Was ich getan habe, ist dies:
- erstellen, die das Thema Generika.xaml-enthält die styles (funktioniert)
- fügen Sie ein Wörterbuch, um zu verschmelzen in generic.xaml enthalten, die Pinsel in der Anwendung verwendet wird (funktioniert)
- machen Bürsten haben ComponentResourceKey-Tasten (funktioniert)
- Steuern, verwenden Sie Bürsten, die als statische Ressource (funktioniert)
- Steuern, verwenden Sie Bürsten, die als dynamische Ressource (FUNKTIONIERT NICHT, die Ressource trace-Quelle sagt so viel: System.Windows.ResourceDictionary Achtung: 9 : Ressource nicht gefunden; )
- add-in App.Ressourcen dynamisch eine Bürste mit der gleichen Taste (funktioniert mit dynamischen Ressource, es verändert die Farben, funktioniert nicht mit statischen Ressourcen, wie erwartet)
Also mein problem ist, dass ich finde keine Möglichkeit, die Definition der default-Werte in das Thema, so dass ich Sie ändern kann programmgesteuert in der Anwendung. Wie kann StaticResource finden Sie den Pinsel und DynamicResource nicht?!
Muss ich hinzufügen, dass ich ' ve erstellt eine statische Klasse und halten der Komponente Ressource-Schlüssel als Eigenschaften, die ich im xaml-als {x:Static UI:ResourceScheme.ControlBackgroundKey} zum Beispiel. Mein problem scheint ähnlich zu dieser: ComponentResourceKey als DynamicResource problem nur, dass, wenn ich ersetzen Sie die statische Eigenschaft-Tasten, um die XAML-markup für die Komponente resource key, es funktioniert immer noch nicht.
Kann mir bitte jemand helfen hier? 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich behoben. Es scheint, dass die Art, die für die Komponente resource key in einer anderen Baugruppe verursacht das ganze Problem. Lassen Sie mich zusammenfassen:
Das Endergebnis lautet:
Die Lösung für diese zu sein scheint, bewegen sich der Mittel-Klasse in der Steuerelemente-Bibliothek.
Als ich weiß immer noch nicht, warum dies passiert ist, diese Frage bleibt offen, auch wenn es leicht verändert: warum geht es nicht im ersten Szenario?
Hier ist der Unterschied,
StaticResource Lasten zum Zeitpunkt der Verladung, dies bedeutet, dass der Ressourcen-Schlüssel, den Sie verwenden, muss lexikalisch definiert, die vor der Nutzung.
So, statische Ressource im Falle des custom control definiert werden muss, die nur über die control-definition in die gleiche generische.der xaml-Datei. Also, wenn Sie Ihre Pinsel in verschiedenen xaml-Code, wird es sicherlich nicht funktionieren, im Falle von statischen Ressourcen.
Dies ist der Grund, es sei denn, der andere Ressourcen von Typ xaml enthalten ist in form von eine Art von import-zu einer Zeit, complile in der gleichen Datei, die Sie nicht verwenden können, statische Ressource in der Datei. Es bedeutet einfach, dass die Datei/Komponente/control das eigentliche xaml-einige, wie sollte enthalten die tatsächlichen Verweis auf die statische Ressource, die Sie verwenden.
Nun habe ich meine Zweifel, warum DynamicResource wird nicht funktionieren, das ist, weil wahrscheinlich DynamicResource nur Aussehen bei der Applikation (wo das Steuerelement verwenden) ResourceDictionary aber nicht generisch.xaml.
Ich bin mir nicht 100% sicher, aber ich sich fühlen, wenn Sie ein benutzerdefiniertes Steuerelement, und wenn Sie DynamicResource dann Ihre Ressourcen werden in der Anwendung Ressource-Wörterbuch oder den übergeordneten container des Steuerelements-Ressource-Wörterbuch, aber es kann nicht sein, dass generische in.xaml.
Weil DynamicResource nur, sich bis zum Schlüssel in der logischen Struktur der Kontrolle der Laufzeitumgebung und das ist, warum kann es nicht finden Ressourcen, die Sie in generischen.xaml-es sei denn, generische.xaml ist explizit Hinzugefügt in der Anwendung.Ressourcen.
Zusammenfassung:
StaticResource verfügbar sein muss lexikalisch vor in der gleichen Datei zur compile-Zeit, - Ressourcen verfügbar sein wird in Anwendung.Ressourcen-Wörterbuch, es kann immer noch finden Sie im logischen Baum aber zu einem compile-Zeit nur in der gleichen dll oder der gleichen generischen.xaml.
DynamicResource muss gesucht werden Anwendung.Ressourcen und in der logischen Struktur des Steuerelements zur Laufzeit.
Weitere Referenz, überprüfen Sie bitte Ressourcen-Übersicht
Application.Current.Resources
ausschließlich jede andere Ressource Wörterbuch in der logischen Struktur der Steuerung (z.B. Fenster) nicht zu funktionieren scheint. Darüber hinaus werden die dynamischen Ressourcen müssen zusammengeführt statt zusätzlichen.Ich versucht, Ihr problem reproduzieren zu testen, ein paar Theorien, warum es nicht funktioniert, jedoch konnte ich das problem nicht reproduzieren. Das setup scheint zu funktionieren.
Also statt einer Beschreibung eine Lösung, die ich beschreiben will, nicht arbeiten repro-setup.
Die Lösung
Ziel-framework: 4.6
Projekte
Inhalt der Datei
Thema.xaml
Tasten.cs
MainWindow.xaml
Und für die faulen Leute, hier ein screenshot: