.net - wpf resourcedictionary




Was ist der Unterschied zwischen StaticResource und DynamicResource in WPF? (8)

  1. StaticResource verwendet den ersten Wert. DynamicResource verwendet den letzten Wert.
  2. DynamicResource kann für verschachtelten Stil verwendet werden, StaticResource nicht.

Angenommen, Sie haben dieses verschachtelte Stilwörterbuch. LightGreen befindet sich auf der Stammebene, während Pink in einem Grid verschachtelt ist.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Grid}">
        <Style.Resources>
            <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
                <Setter Property="Background" Value="Pink"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
        <Setter Property="Background" Value="LightGreen"/>
    </Style>
</ResourceDictionary>

Im Hinblick auf:

<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ConflictingStyleWindow" Height="100" Width="100">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Style="{DynamicResource ConflictButton}" Content="Test"/>
    </Grid>
</Window>

StaticResource rendert die Schaltfläche als LightGreen, den ersten Wert, der im Stil gefunden wurde. DynamicResource überschreibt die LightGreen-Schaltfläche als Pink, während das Raster gerendert wird.

StaticResource

DynamischeRessource

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 wird einen Fehler ausgeben, wenn der Stammebenen-Stil (LightGreen) entfernt wird.

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 einer, und der andere löst während der Laufzeit eine Ausnahme aus. Aber ich würde gerne wissen warum:

  • Was ist der Hauptunterschied? Wie Gedächtnis- oder Leistungsimplikationen
  • Gibt es Regeln in WPF wie "Pinsel sind immer statisch" und "Vorlagen sind immer dynamisch" etc.?

Ich nehme an, die Wahl zwischen Static vs Dynamic ist nicht so willkürlich wie es scheint ... aber ich sehe das Muster nicht.


Der Unterschied zwischen StaticResource und DynamicResource besteht darin, wie die Ressourcen von den referenzierenden Elementen abgerufen werden. StaticResource wird nur einmal vom referenzierenden Element abgerufen und für die gesamte Lebensdauer der Ressource verwendet. Auf der anderen Seite werden DynamicResource jedes Mal erfasst, wenn das referenzierte Objekt verwendet wird.


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

In einem zusammengesetzten WPF-Szenario kann das Benutzersteuerelement Ressourcen verwenden, die in einem anderen übergeordneten Fenster / Steuerelement definiert sind (das dieses Benutzersteuerelement hosten soll), indem auf diese Ressource als DynamicResource verwiesen wird.

Wie von anderen erwähnt, wird Staticresource zur Kompilierzeit gesucht. Benutzersteuerelemente können nicht auf die Ressourcen verweisen, die in der Hosting- / übergeordneten Steuerung definiert sind. In diesem Fall könnte jedoch DynamicResource verwendet werden.


Ich war auch verwirrt über sie. Siehe folgendes Beispiel:

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

Hier habe ich dynamische Ressource für Button und Fenster verwendet und habe es nirgendwo deklariert. Zur Laufzeit wird das ResourceDictionary der Hierarchie überprüft. Da ich es nicht definiert habe, nehme ich an, dass der Standardwert verwendet wird.

Wenn ich den folgenden Code zum click -Ereignis von Button hinzufüge, wird der Hintergrund entsprechend aktualisiert, da sie DynamicResource verwenden.

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

Wenn sie StaticResource verwendet hätten:

  • Die Ressource muss in XAML deklariert werden
  • Und das auch "bevor" sie benutzt werden.

Hoffe, ich habe etwas Verwirrung gemacht.


Mit logischen Ressourcen können Sie Objekte in XAML definieren, die nicht Teil der visuellen Struktur sind, aber in Ihrer Benutzerschnittstelle verwendet werden können. Eines der Beispiele für eine logische Ressource ist Brush, mit dem ein Farbschema bereitgestellt wird. Im Allgemeinen werden diese Objekte als Ressourcen definiert, die von mehreren Elementen der Anwendungen verwendet werden.

<Window.Resources>
    <RadialGradientBrush x:Key="myGradientBrush">
        <GradientStop Color="Green" Offset="0"/>
        <GradientStop Color="Blue" Offset="2"/>
    </RadialGradientBrush>
</Window.Resources>

Jetzt kann die oben angegebene Ressource als statische oder dynamische Ressource verwendet werden. Ein zu beachtender Punkt ist, dass bei der Verwendung von statischen Ressourcen zuerst im XAML-Code definiert werden sollte, bevor auf ihn verwiesen werden kann. Statische und dynamische Ressourcen können verwendet werden als:

<Grid Background="{StaticResource myGradientBrush}"></Grid>

oder:

<Grid Background="{DynamicResource myGradientBrush}"></Grid>

Der Unterschied zwischen StaticResource und DynamicResource besteht darin, wie die Ressourcen von den referenzierenden Elementen abgerufen werden. StaticResource wird nur einmal vom referenzierenden Element abgerufen und für die gesamte Lebensdauer der Ressource verwendet. Auf der anderen Seite werden DynamicResource jedes Mal erfasst, wenn das referenzierte Objekt verwendet wird.

Einfacher ausgedrückt: Wenn die Farbeigenschaft von RadialGradientBrush im Code in Orange und Pink geändert wird, werden Elemente nur dann berücksichtigt, wenn die Ressource als DynamicResource verwendet wird. Unten ist der Code zum Ändern der Ressource im Code:

RadialGradientBrush radialGradientBrush =
    new RadialGradientBrush(Colors.Orange, Colors.Pink);
this.Resources["myGradientBrush"] = radialGradientBrush;

Der Nachteil von DynamicResource ist, dass die Anwendungsleistung verringert wird, da Ressourcen bei jeder Verwendung abgerufen werden. Die beste Vorgehensweise ist die Verwendung von StaticResource, bis ein bestimmter Grund für die Verwendung von DynamicResource gegeben ist.

Quelle:
WPF: StaticResource vs. DynamicResource


StaticResource wird bei der Objektkonstruktion aufgelöst.
DynamicResource wird jedes Mal ausgewertet und aufgelöst, wenn die Kontrolle die Ressource benötigt.


Wichtiger Vorteil der dynamischen Ressourcen

Wenn der Start der Anwendung extrem lange dauert, müssen Sie dynamische Ressourcen verwenden, da statische Ressourcen immer geladen werden, wenn das Fenster oder die Anwendung erstellt wird, während dynamische Ressourcen bei der ersten Verwendung geladen werden.

Sie werden jedoch keinen Vorteil sehen, wenn Ihre Ressource nicht extrem groß und komplex ist.


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

Statische Ressourcen werden unter folgenden Umständen verwendet:

       1.When reaction resource changes at runtime is not required.
       2.If you need a good performance with lots of resources.
       3.While referencing resources within the same dictionary.

 Dynamic resources:
   1.Value of property or style setter theme is not known untill runtime 
      a. This include system ,aplication,theme based settings
      b. This also includes forward references.

   2.Referencing large resources that may not load when    page,windows,usercontrol loads .

   3. Referncing theme styles in a custom control.






resources