.net - wpf resource file




Quelle est la différence entre StaticResource et DynamicResource dans WPF? (8)

Lors de l'utilisation de ressources telles que des styles, des modèles et des styles dans WPF, ils peuvent être spécifiés sous la forme StaticResources

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

ou en tant que DynamicResource

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

La plupart du temps (toujours?), Un seul fonctionne et l'autre jette une exception pendant l'exécution. Mais j'aimerais savoir pourquoi:

  • Quelle est la principale différence? Comme la mémoire ou les implications de performance
  • Existe-t-il des règles dans WPF comme "les pinceaux sont toujours statiques" et "les gabarits sont toujours dynamiques", etc.?

Je suppose que le choix entre Statique et Dynamique n'est pas aussi arbitraire que cela semble ... mais je ne vois pas le modèle.


  1. StaticResource utilise la première valeur. DynamicResource utilise la dernière valeur.
  2. DynamicResource peut être utilisé pour le style imbriqué, mais pas pour StaticResource.

Supposons que vous ayez ce dictionnaire Style imbriqué. LightGreen est au niveau de la racine tandis que Pink est imbriqué dans une grille.

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

En vue:

<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 rendra le bouton LightGreen, la première valeur trouvée dans le style. DynamicResource remplacera le bouton LightGreen en rose au fur et à mesure qu'il restitue la grille.

StaticResource

DynamicResource

Gardez à l'esprit que VS Designer traite DynamicResource comme StaticResource. Il aura la première valeur. Dans ce cas, VS Designer rendra le bouton en tant que LightGreen bien qu'il finisse par être en rose.

StaticResource renvoie une erreur lorsque le style au niveau racine (LightGreen) est supprimé.


Avantage important des ressources dynamiques

Si le démarrage de l'application prend extrêmement de temps, vous devez utiliser des ressources dynamiques, car les ressources statiques sont toujours chargées lors de la création de la fenêtre ou de l'application, tandis que les ressources dynamiques sont chargées lors de leur première utilisation.

Cependant, vous ne verrez aucun avantage à moins que votre ressource soit extrêmement grande et complexe.


La différence entre StaticResource et DynamicResource réside dans la manière dont les ressources sont récupérées par les éléments de référence. StaticResource ne sont récupérées qu'une seule fois par l'élément de référence et utilisées pendant toute la durée de vie de la ressource. D'un autre côté, DynamicResource est acquis chaque fois que l'objet référencé est utilisé.


Les ressources logiques vous permettent de définir des objets en XAML, qui ne font pas partie de l'arborescence visuelle mais peuvent être utilisés dans votre interface utilisateur. L'un des exemples d'une ressource logique est Brush, qui est utilisé pour fournir un schéma de couleurs. Généralement, ces objets sont définis comme des ressources, qui sont utilisées par plusieurs éléments des applications.

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

Maintenant, la ressource déclarée ci-dessus peut être utilisée comme ressource statique ou dynamique. Un point à retenir est que, lors de l'utilisation de ressources statiques, il doit d'abord être défini dans le code XAML, avant de pouvoir être référé. Les ressources statiques et dynamiques peuvent être utilisées comme:

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

ou:

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

La différence entre StaticResource et DynamicResource réside dans la manière dont les ressources sont récupérées par les éléments de référence. StaticResource ne sont récupérées qu'une seule fois par l'élément de référence et utilisées pendant toute la durée de vie de la ressource. D'un autre côté, DynamicResource est acquis chaque fois que l'objet référencé est utilisé.

Pour le simplifier, si la propriété couleur de RadialGradientBrush est modifiée en code en Orange et en Rose, elle ne reflétera sur les éléments que lorsque la ressource est utilisée comme DynamicResource. Voici le code pour changer la ressource en code:

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

Le démérite de DynamicResource est qu'il réduit les performances des applications car les ressources sont récupérées chaque fois qu'elles sont utilisées. La meilleure pratique consiste à utiliser StaticResource jusqu'à ce qu'il y ait une raison spécifique d'utiliser DynamicResource.

La source:
WPF: StaticResource vs. DynamicResource


StaticResource sera résolu lors de la construction de l'objet.
DynamicResource sera évalué et résolu chaque fois que le contrôle aura besoin de la ressource.


Trouvé toutes les réponses utiles, je voulais juste ajouter un cas d'utilisation plus.

Dans un scénario WPF composite, votre contrôle utilisateur peut utiliser les ressources définies dans toute autre fenêtre / tout contrôle parent (qui va héberger ce contrôle utilisateur) en faisant référence à cette ressource en tant que DynamicResource.

Comme mentionné par d'autres, Staticresource sera recherché lors de la compilation. Les contrôles utilisateur ne peuvent pas faire référence aux ressources définies dans le contrôle d'hébergement / parent. Cependant, DynamicResource pourrait être utilisé dans ce cas.


Voici la principale différence entre les ressources statiques et dynamiques:

  1. La ressource statique n'évaluera la ressource qu'une seule fois, tandis que la ressource dynamique sera évaluée chaque fois que la ressource aura besoin d'une ressource.

La ressource 2.Dynamic a plus de surcharge de performances que les ressources statiques car elle recherche des ressources chaque fois qu'elle est demandée ou nécessaire.

3. La ressource statique est plus rapide, mais il faut un peu plus de temps pour charger la page ou la fenêtre que la ressource dynamique car les ressources dynamiques sont chargées lorsque vous les utilisez réellement.


Les ressources dynamiques ne peuvent être utilisées que lorsque la propriété en cours est définie sur un objet dérivé de l'objet de dépendance ou sur freezable, où les ressources statiques peuvent être utilisées n'importe où. Vous pouvez faire abstraction de tout le contrôle en utilisant des ressources statiques.

Les ressources statiques sont utilisées dans les circonstances suivantes:

       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