Wenn Sie Ressourcen wie Pinsel, Vorlagen und Stile in WPF verwenden, können Sie diese entweder als StaticResources angeben
<Rectangle Fill="{StaticResource MyBrush}" />
oder als DynamicResource
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
Meistens (immer?) Funktioniert nur einer und der andere löst zur Laufzeit eine Ausnahme aus. Aber ich würde gerne wissen warum:
- Was ist der Hauptunterschied. Wie Gedächtnis- oder Leistungsimplikationen
- Gibt es in WPF Regeln wie "Pinsel sind immer statisch" und "Vorlagen sind immer dynamisch" usw.?
Ich gehe davon aus, dass die Wahl zwischen Statisch und Dynamisch nicht so willkürlich ist, wie es scheint ... aber ich sehe das Muster nicht.
Antworten:
Eine statische Ressource wird aufgelöst und der Eigenschaft beim Laden der XAML zugewiesen, das erfolgt, bevor die Anwendung tatsächlich ausgeführt wird. Es wird nur einmal zugewiesen und Änderungen am Ressourcenwörterbuch werden ignoriert.
Eine DynamicResource weist der Eigenschaft beim Laden ein Expression-Objekt zu, sucht die Ressource jedoch erst zur Laufzeit, wenn das Expression-Objekt nach dem Wert gefragt wird. Dadurch wird das Nachschlagen der Ressource verzögert, bis sie zur Laufzeit benötigt wird. Ein gutes Beispiel wäre eine Vorwärtsreferenz auf eine Ressource, die später in der XAML definiert wird. Ein weiteres Beispiel ist eine Ressource, die erst zur Laufzeit vorhanden ist. Das Ziel wird aktualisiert, wenn das Quellressourcenwörterbuch geändert wird.
quelle
It will update the target if the source resource dictionary is changed.
Ich war auch verwirrt über sie. Siehe dieses Beispiel unten:
Hier habe ich dynamische Ressourcen für Schaltflächen und Fenster verwendet und sie nirgendwo deklariert. Zur Laufzeit wird das ResourceDictionary der Hierarchie überprüft. Da ich es nicht definiert habe, wird vermutlich die Standardeinstellung verwendet.
Wenn ich den folgenden Code hinzufüge, um auf das Ereignis von Button zu klicken, wird der Hintergrund entsprechend aktualisiert, da DynamicResource verwendet wird.
Wenn sie StaticResource verwendet hätten:
Ich hoffe, ich habe einige Verwirrung beseitigt.
quelle
StaticResource wird bei der Objektkonstruktion aufgelöst.
DynamicResource wird jedes Mal ausgewertet und aufgelöst, wenn die Steuerung die Ressource benötigt.
quelle
Angenommen, Sie haben dieses verschachtelte Stilwörterbuch. LightGreen befindet sich auf der Stammebene, während Pink in einem Raster verschachtelt ist.
Im Hinblick auf:
StaticResource rendert die Schaltfläche als LightGreen, den ersten Wert, den sie im Stil gefunden hat. DynamicResource überschreibt die LightGreen-Schaltfläche beim Rendern des Rasters als Pink.
StaticResource
DynamicResource
Beachten Sie, dass VS Designer DynamicResource als StaticResource behandelt. Es wird den ersten Wert erhalten. In diesem Fall rendert VS Designer die Schaltfläche als LightGreen, obwohl sie tatsächlich als Pink endet.
StaticResource gibt einen Fehler aus, wenn der Stil auf Stammebene (LightGreen) entfernt wird.
quelle
Was ist der Hauptunterschied. Wie Gedächtnis- oder Leistungsimplikationen
Der Unterschied zwischen statischen und dynamischen Ressourcen entsteht, wenn sich das zugrunde liegende Objekt ändert. Wenn auf Ihren in der Ressourcenauflistung definierten Pinsel im Code zugegriffen und auf eine andere Objektinstanz festgelegt wurde, erkennt Rectangle diese Änderung nicht.
Statische Ressourcen werden einmal durch Referenzieren eines Elements abgerufen und für die Lebensdauer der Ressourcen verwendet. DynamicResources werden bei jeder Verwendung abgerufen.
Der Nachteil dynamischer Ressourcen besteht darin, dass sie die Anwendungsleistung tendenziell verringern.
Gibt es in WPF Regeln wie "Pinsel sind immer statisch" und "Vorlagen sind immer dynamisch" usw.?
Die beste Vorgehensweise besteht darin, statische Ressourcen zu verwenden, es sei denn, es gibt einen bestimmten Grund, warum Sie die Ressource im dahinter stehenden Code dynamisch ändern möchten. Ein weiteres Beispiel für eine Instanz, in der Sie keine dynamischen Ressourcen verwenden möchten, ist die Verwendung der SystemBrushes, SystenFonts und Systemparameter.
quelle
Fand alle Antworten nützlich, wollte nur einen weiteren Anwendungsfall hinzufügen.
In einem zusammengesetzten WPF-Szenario kann Ihr Benutzersteuerelement Ressourcen verwenden, die in einem anderen übergeordneten Fenster / Steuerelement (das dieses Benutzersteuerelement hosten wird) definiert sind, indem diese Ressource als DynamicResource bezeichnet wird.
Wie von anderen erwähnt, wird Staticresource zur Kompilierungszeit nachgeschlagen. Benutzersteuerelemente können nicht auf die Ressourcen verweisen, die im Hosting- / übergeordneten Steuerelement definiert sind. In diesem Fall könnte jedoch DynamicResource verwendet werden.
quelle
Wichtiger Vorteil der dynamischen Ressourcen
Wenn der Start der Anwendung extrem lange dauert, müssen Sie dynamische Ressourcen verwenden, da statische Ressourcen beim Erstellen des Fensters oder der App immer geladen werden, während dynamische Ressourcen bei der ersten Verwendung geladen werden.
Sie werden jedoch keinen Nutzen sehen, wenn Ihre Ressource nicht extrem groß und komplex ist.
quelle
Dynamische Ressourcen können nur verwendet werden, wenn sich die festgelegte Eigenschaft auf einem Objekt befindet, das vom Abhängigkeitsobjekt abgeleitet oder eingefroren werden kann, da statische Ressourcen überall verwendet werden können. Sie können das gesamte Steuerelement mithilfe statischer Ressourcen abstrahieren.
Statische Ressourcen werden unter folgenden Umständen verwendet:
Dynamische Ressourcen:
quelle