538 Stimmen

Was ist der Unterschied zwischen StaticResource und DynamicResource in WPF?

Wenn Ressourcen wie Pinsel, Vorlagen und Stile in WPF verwendet werden, können sie entweder als StaticResources angegeben werden

<Rectangle Fill="{StaticResource MyBrush}" />

oder als DynamicResource

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

Meistens (immer?) funktioniert nur eine und die andere löst während der Laufzeit eine Ausnahme aus. Aber ich würde gerne wissen, warum:

  • Was ist der Hauptunterschied? Wie Speicher oder Auswirkungen auf die Leistung
  • Gibt es in WPF Regeln wie "Pinsel sind immer statisch" und "Vorlagen sind immer dynamisch" usw.?

I annehmen die Wahl zwischen statisch und dynamisch ist nicht so willkürlich, wie es scheint... aber ich kann das Muster nicht erkennen.

33 Stimmen

Es ist wichtig zu beachten, dass Windows 8 App-Entwickler keine DyanmicResource als Option haben, nur StaticResource.

2 Stimmen

@Jerry Nixon Gott sei Dank, ich habe nicht mehr gezählt, wie oft ich etwas nicht zum Laufen gebracht habe, weil ich DynamicResource statt StaticResource oder umgekehrt verwendet habe. Aus der Sicht des Programmierers ist das eine unnötige Komplexität. Eine Analogie dazu ist die Definition von Variablen. Sollte ich explizit angeben müssen, ob sie auf dem Heap oder dem Stack liegen? Und wenn ich das falsch mache, kommt es zu einem katastrophalen Laufzeitfehler?

0 Stimmen

Eine genauere Erläuterung von StaticResource und DynamicResource und wann sie zu verwenden sind, finden Sie unter msdn.microsoft.com/de-us/library/ms750613%28v=vs.100%29.aspx .

13voto

Manish Basantani Punkte 15815

Ich fand alle Antworten nützlich, wollte nur einen weiteren Anwendungsfall hinzufügen.

In einem zusammengesetzten WPF-Szenario kann Ihr Benutzersteuerelement Ressourcen nutzen, die in einem anderen übergeordneten Fenster/Steuerelement (das dieses Benutzersteuerelement beherbergen wird) definiert sind, indem es auf diese Ressource als DynamicResource verweist.

Wie bereits von anderen erwähnt, wird die Staticresource zur Kompilierzeit nachgeschlagen. Benutzersteuerelemente können sich nicht auf die Ressourcen beziehen, die im host/parent control definiert sind. In diesem Fall könnte jedoch DynamicResource verwendet werden.

0 Stimmen

"Staticresource wird zur Kompilierzeit nachgeschlagen." . Das glaube ich nicht. "Kompilierzeit" würde bedeuten "zum Zeitpunkt der Erstellung der Anwendung". Siehe Verhalten bei der Suche nach statischen Ressourcen . Statische Ressource wird nachgeschlagen wenn das Xaml zum ersten Mal geladen wird . Das geschieht zur Laufzeit. Der Unterschied zwischen statischer und dynamischer Suche besteht darin, dass die statische Suche nur EINMAL stattfindet (und einfacheren Suchregeln folgt). Betrachten Sie "Die statische Ressourcensuche kann sich auf Themen oder Systemressourcen erstrecken." .

1 Stimmen

Ahh, ich dachte daran, wie eine Seite Ihr Steuerelement verwendet, nicht, was Ihr Steuerelement in seinem Ressourcenwörterbuch tun kann. Ich verstehe Ihren Punkt - es ist impliziert durch "Statische Ressourcenreferenzen innerhalb eines Ressourcenverzeichnisses müssen auf eine Ressource verweisen, die bereits lexikalisch vor der Ressourcenreferenz definiert wurde." - die meines Erachtens zur Kompilierzeit auflösbar sein muss.

6voto

zamoldar Punkte 510

Wichtiger Vorteil der dynamischen Ressourcen

Wenn der Start der Anwendung extrem lange dauert, müssen Sie dynamische Ressourcen verwenden, denn statische Ressourcen werden immer geladen, wenn das Fenster oder die Anwendung erstellt wird, während dynamische Ressourcen geladen werden, wenn sie zum ersten Mal verwendet werden.

Sie werden jedoch keinen Nutzen daraus ziehen, es sei denn, Ihre Ressource ist extrem groß und komplex.

0 Stimmen

Entsteht bei DynamicResources ein Leistungsproblem nur einmal (bei der ersten Verwendung) oder jedes Mal, wenn das Element verwendet wird?

0 Stimmen

In diesem Fall müssen die meisten verwendeten Felder statische Ressourcen sein, benutzerdefinierte Felder können dynamisch sein, d.h. für das Hauptfenster sind die Ressourcen statisch und für das Dialogfenster können sie dynamisch sein

0 Stimmen

Kann man in manchen Situationen diese Einschränkung nicht umgehen, indem man Code schreibt, der das Ressourcenverzeichnis ergänzt, bevor die XAML der zweiten Seite geladen wird?

5voto

iaminvinicble Punkte 344

Dynamische Ressourcen können nur verwendet werden, wenn die Eigenschaft auf ein Objekt gesetzt wird, das von einem Abhängigkeitsobjekt oder Freezable abgeleitet ist, während statische Ressourcen überall verwendet werden können. Sie können das gesamte Steuerelement mit statischen Ressourcen abstrahieren.

Statische Ressourcen werden unter folgenden Umständen verwendet:

  1. Wenn eine Reaktion auf Ressourcenänderungen zur Laufzeit nicht erforderlich ist.
  2. Wenn Sie eine gute Leistung mit vielen Ressourcen benötigen.
  3. Beim Verweis auf Ressourcen innerhalb desselben Wörterbuchs.

Dynamische Ressourcen:

  1. Der Wert einer Eigenschaft oder eines Stil-Setter-Themas ist erst zur Laufzeit bekannt
    • Dazu gehören System-, Anwendungs- und themenbezogene Einstellungen
    • Dazu gehören auch Vorwärtsreferenzen.
  2. Verweis auf große Ressourcen, die möglicherweise nicht geladen werden, wenn die Seite, Windows oder das Benutzerkontrollsystem geladen wird.
  3. Referenzierung von Themenstilen in einem benutzerdefinierten Steuerelement.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X