Frage

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

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

oder als Dynamic

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

Die meisten der Zeit (immer?), Nur ein Werk und die andere Ausnahme während der Laufzeit werfen. Aber ich würde gerne wissen, warum:

  • Was ist der Hauptunterschied ist. Wie Speicher oder Auswirkungen auf die Leistung
  • Gibt es in WPF-Regeln wie „Bürste immer statisch“ und „Vorlagen sind immer dynamisch“ etc.?

I übernehmen die Wahl zwischen Static vs Dynamic ist nicht so willkürlich wie es scheint ... aber ich kann nicht um das Muster zu sehen.

War es hilfreich?

Lösung

Static wird aufgelöst und während der Beladung des XAML der Eigenschaft zugeordnet, die auftritt, bevor die Anwendung tatsächlich ausgeführt werden. Es wird nur einmal vergeben werden und alle Änderungen Wörterbuch ignoriert Ressourcen.

Dynamic Abtretungs ein Expression-Objekt auf die Eigenschaft beim Laden aber Nachschlag nicht tatsächlich die Ressource erst zur Laufzeit, wenn das Expression-Objekt für den Wert gefragt. Diese aufschiebt sucht, um die Ressource, bis es zur Laufzeit benötigt wird. Ein gutes Beispiel wäre ein Vorwärtsverweis auf eine Ressource später im XAML definiert sein. Ein weiteres Beispiel ist eine Ressource, die nicht einmal bis zur Laufzeit vorhanden ist. Es wird das Ziel aktualisieren, wenn die Quelle Ressourcenverzeichnis geändert wird.

Andere Tipps

Ich war auch verwirrt über sie. Sehen Sie dieses Beispiel unter:

<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 eine dynamische Ressourcen für Button und Fenster verwendet haben und es nicht anywhere.Upon Laufzeit erklärt, wird die Resource der Hierarchie checked.Since ich es nicht definiert haben, ich denke, das standardmäßig verwendet wird.

Wenn ich den Code hinzufügen Falle Knopf klicken, da sie Dynamic verwenden, wird der Hintergrund entsprechend aktualisiert.

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

Wenn hatten sie verwendet Static:

  • Die Ressource in XAML deklariert werden muss
  • Und das auch „vor“ sie verwendet werden.

Hope räumte ich einige Verwirrung.

Static wird auf Objektkonstruktion gelöst werden.
Dynamic wird jedes Mal, Kontrolle muss die Ressource ausgewertet und aufgelöst werden.

Logische Ressourcen können Sie Objekte in XAML definieren, die nicht Teil der visuellen Struktur sind, aber in der Benutzeroberfläche verwendet werden. Eines der Beispiele einer logischen Ressource Bürste, die ein Farbschema zu schaffen, verwendet wird. Im Allgemeinen werden diese Objekte als Ressourcen definiert, die durch mehrere Elemente der Anwendungen verwendet werden.

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

Nun könnte oben angegebene Ressource als entweder statisch oder dynamisch Ressource verwendet werden. Ein Punkt ist, dass, wenn statische Ressourcen verwenden, sollten sie zunächst in XAML-Code definiert werden, bevor sie bezeichnet werden kann. Statische und dynamische Ressourcen können wie folgt verwendet werden:

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

oder:

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

Der Unterschied zwischen Static und Dynamic liegt darin, wie die Ressourcen durch die Referenzierung Elemente abgerufen werden. Static werden nur einmal durch die Referenzierung Element abgerufen und für gesamte Lebensdauer der Ressource verwendet wird. Auf der anderen Seite wird Dynamic werden jedes Mal, das referenzierte Objekt verwendet erworben.

Um es in einfacher Art und Weise, wenn die Farbeigenschaft von RadialGradientBrush wird in Code zu Orange und Rosa geändert, dann wird es auf Elemente beziehen sich nur, wenn Ressource als Dynamic verwendet wird. Unten ist der Code der Ressource in Code zu ändern:

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

Der Nachteil von Dynamic ist, dass es die Anwendungsleistung reduziert, weil Ressourcen jedes Mal, wenn sie verwendet werden, abgerufen werden. Die beste Vorgehensweise ist die Verwendung zu Static bis es einen bestimmten Grund ist Dynamic zu verwenden.

Quelle:
WPF: Static vs. Dynamic

  1. Static verwendet erster Wert. Dynamic verwendet letzter Wert.
  2. Dynamic kann für verschachtelten Styling verwendet werden, Static nicht.

Angenommen, Sie dieses verschachtelte Art Wörterbuch haben. Lightgreen ist auf der obersten Ebene, während Rosa in einem Raster 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:

<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>

Static wird die Taste als Lightgreen, der erste Wert, den es im Stil gefunden machen. Dynamic wird die Taste als Lightgreen Rosa außer Kraft setzen, wie es die Grid macht.

Static Static

Dynamic Dynamic

Beachten Sie, dass VS Designer Dynamic als Static behandelt. Es wird zunächst Wert. In diesem Fall werden VS Designer auf die Schaltfläche als Lightgreen machen, obwohl es eigentlich als Rosa landet.

Static wirft einen Fehler, wenn der Stammebene Stil (Lightgreen) entfernt wird.

Was ist der Hauptunterschied. Wie Speicher oder Auswirkungen auf die Leistung

Der Unterschied zwischen statischen und dynamischen Ressourcen kommt, wenn die zugrunde liegenden Objektänderungen. Wenn Sie Ihre Pinsel in der Sammlung Ressourcen definiert wurden in Code und auf eine andere Objektinstanz zugegriffen, Rechteck wird diese Änderung nicht erkennen.

Statische Ressourcen einmal abgerufen durch das Element Referenzierung und für die gesamte Lebensdauer der Ressourcen verwendet. Ange abrufen Dynamic jedesmal, wenn sie verwendet werden.

Der Nachteil der dynamischen Ressourcen ist, dass sie neigen dazu, die Anwendungsleistung zu verringern.

Gibt es in WPF-Regeln wie "Bürste immer statisch" und "Vorlagen sind immer dynamisch" etc.?

Die beste Vorgehensweise ist statische Ressourcen zu verwenden, wenn es einen bestimmten Grund ist wie Sie Ressource im Code hinter sich dynamisch ändern möchten. Ein weiteres Beispiel für Fall, in dem wollen Sie t dynamische resoruces verwenden ist, wenn Sie die SystemBrushes verwenden, SystenFonts und Systemparameter.

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

hinzufügen wollte

In einem zusammengesetzten WPF Szenario Benutzersteuerung kann in jeder anderen übergeordneten Fenstern / Kontrolle definierten Nutzung von Ressourcen machen (das wird diese Benutzersteuerung Host) durch, um diese Ressource als Dynamic Bezug genommen wird.

Wie bereits von anderen erwähnt, wird Static bei der Kompilierung nachgeschlagen werden. Benutzersteuerungen können nicht auf diese Ressourcen beziehen, die in Hosting / geordneten Steuerung definiert sind. Obwohl, Dynamic in diesem Fall verwendet werden könnte.

Wichtige Vorteile der dynamischen Ressourcen

, wenn Start der Anwendung extrem lange Zeit in Anspruch nimmt, müssen Sie dynamische Ressourcen verwenden, weil statische Ressourcen immer geladen werden, wenn das Fenster oder die Anwendung erstellt wird, während dynamische Ressourcen geladen werden, wenn sie zum ersten Mal verwendet sind.

Sie werden jedoch keinen Nutzen sehen, es sei denn Ihre Ressource extrem groß ist und Komplex.

Dynamische Ressourcen können nur dann verwendet werden, wenn Eigenschaft festgelegt wird, auf das Objekt ist, die sich von Abhängigkeitsobjekt oder freezable abgeleitet wird, in dem als statische Ressourcen überall eingesetzt werden kann. Sie können abstrahieren gesamte Steuerung mit statischen Ressourcen.

Statische Ressourcen verwendet werden, unter folgenden Bedingungen:

  1. Wenn die Reaktion Ressourcenänderungen zur Laufzeit ist nicht erforderlich.
  2. Wenn Sie eine gute Leistung mit vielen Ressourcen benötigen.
  3. Während Referenzierung Ressourcen im gleichen Wörterbuch.

Dynamische Informationen:

  1. Wert von Eigentum oder Stil Setter Thema wird erst zur Laufzeit bekannt
    • Dazu gehören System, aplication, themenbezogene Einstellungen
    • Dazu gehört auch die Vorwärts-Referenzen.
  2. große Ressourcen referenzieren, die geladen werden kann nicht, wenn Seite, Fenster, Usercontrol Lasten.
  3. Referenzierung Thema Stile in einem benutzerdefinierten Steuerelement.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top