2017-10-18 6 views
2

J'ai trouvé this post sur l'amélioration des performances de ResourceDictionaries sur le Web, mais le problème est qu'il est assez vieux (2011). Je pensais à mettre en œuvre quelque chose comme ça, mais je me demande si Microsoft n'a pas corrigé cela dans les dernières versions de .NET Framework. J'ai quelques questions sur ce sujet, qui, je l'espère, quelqu'un ici peut donner une réponse à:Plusieurs instances du même ResourceDictionary

  1. est-.NET Framework 4.6.1 gestion encore ResourceDictionaries en faisant plusieurs instances d'entre eux, un pour chaque fois qu'ils sont affectés à un contrôle?
  2. Est-ce même un problème quand j'ai par exemple le style "CustomButtonStyle" dans mon ResourceDictionary appelé "ButtonStyles" dans l'assemblage appelé "StylesAssembly", qui est ensuite référencé dans App.xaml d'une application, qui a 20 Buttons avec CustomButtonStyle qui leur sont assignées? Est-ce que je comprends bien, dans le cas ci-dessus, il y aura 20 instances de "ButtonStyles"ResourceDictionary?
+0

Je suppose que c'est très facile à tester, mais j'ai du mal à comprendre le scénario exact. Voulez-vous dire un autre assemblage avec dictionnaire de ressources ou quoi? – Sinatr

+0

@ mm8 J'ai édité le point 1 pour le rendre plus facile à comprendre, merci d'avoir signalé mon erreur –

+0

@Sinatr le problème est que je n'ai aucune idée de comment le tester, parce que 'ResourceDictionary' n'a pas de code derrière, donc je peux ' t mettre un point d'arrêt là. Le scénario est le suivant: 'StyleAssembly' est un' ClassLibrary', qui a 'ResourceDictionary' appelé' ButtonStyles', qui contient 'CustomButtonStyle'. Mon application référence 'StyleAssembly' et la fusionne dans App.xaml et ma MainWindow a 20' Buttons' utilisant le style 'CustomButtonStyle'. Est-ce que mon application va créer 20 instances de 'ButtonStyles'? –

Répondre

-1

Merci @ mm8 pour avoir posté votre réponse. C'est 100% correct, je veux juste poster ma propre réponse, parce que j'ai découvert quelque chose d'intéressant, qui peut être utile pour quelqu'un d'autre. La réponse est: L'instance de ResourceDictionary sera créée une seule fois si elle est référencée dans l'application (peu importe le nombre de contrôles utilise ses styles), MAIS elle sera instanciée à chaque fois qu'elle est référencée dans un autre ResourceDictionary également utilisé Dans l'application.


Donc, pour vous donner l'exemple de ce cas, disons que nous avons la structure suivante:

- StylesAssembly.dll 
    - ButtonResourceDictionary.xaml 
    - CustomButtonResourceDictionary.xaml 

- Application.exe 
    - App.xaml 
    - MainWindow.xaml 

ButtonResourceDictionary.xaml a le code suivant:

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}"> 
    <!-- Some setters --> 
</Style> 

CustomButtonResourceDictionary .xaml a le code suivant qui utilise ButtonResourceDictionary.xaml:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="ButtonResourceDictionary.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource DefaultButtonStyle}"> 
    <!-- Some setters --> 
</Style> 

Application.exe a une référence à StylesAssembly.dll et il y a un code suivant dans la App.xaml:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/ButtonResourceDictionary.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/CustomButtonResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Maintenant, si notre MainWindow.xaml a quelque chose comme ça dans ce , le ButtonResourceDictionary.xaml aura seulement un exemple:

<StackPanel> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
</StackPanel> 

mais si notre MainWindow.xaml a quelque chose comme ça en elle, le CustomButtonResourceDictionary.xaml aura une instance, mais le ButtonResourceDictionary.xaml aura deux instances:

<StackPanel> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
</StackPanel> 

Cela arrive parce que les deux premiers Buttons utilisation style DefaultButtonStyle de ButtonResourceDictionary.xaml, mais trois autres Buttons utilisent le style CustomButtonStyle qui vient de CustomButtonResourceDictionary.xaml, qui fusionne ButtonResourceDictionary.xaml dans son code.

+0

C'est le comportement attendu. Comment le dicton fusionné serait-il résolu sans en créer une instance? – mm8

+0

Et je ne discute pas avec ça. C'est difficile à trouver (d'après ce que j'ai vécu aujourd'hui) alors j'ai décidé de tout mettre au même endroit et de le poster ici. Peut-être que cela aidera quelqu'un à l'avenir. –

2

Est-ce que je comprends bien, que dans le cas ci-dessus, il y aura 20 cas de « ButtonStyles » ResourceDictionary?

Non. Un seul.

Est-ce même un problème quand j'ai par exemple le style « CustomButtonStyle » dans mes ResourceDictionary appelés « ButtonStyles » dans l'assemblage appelé « StylesAssembly », qui est ensuite référencé dans App.xaml d'une application, qui a 20 boutons avec CustomButtonStyle assigné à eux?

Si vous fusionnez le ResourceDictionary dans votre App.xaml et de créer 20 Button éléments à travers les points de vue dans votre application, il y aura toujours une seule instance de la classe ResourceDictionary créé.

Vous pouvez confirmer vous en ajoutant un code-behind classe à la ResourceDictionary:

Is it possible to set code behind a resource dictionary in WPF for event handling?

... et mettre un point d'arrêt dans le constructeur.

Il y aura également une seule instance du Style défini dans le ResourceDictionary créé.

+0

Merci, je ne savais pas que je peux ajouter un code derrière la classe à un 'ResourceDictionary'. Je veux vérifier moi-même et si cela fonctionne, je vais le marquer comme une réponse. –

+0

@ mm8, et qu'en est-il de l'instruction * "Chaque fois qu'un contrôle référence un ResourceDictionary XAML crée une nouvelle instance de celui-ci" * from [here] (https://wpftutorial.net/MergedDictionaryPerformance.html)? Je ne dis pas que vous avez tort, mais je soupçonne qu'ils ont utilisé un autre scénario que vous avez testé. – Sinatr

+0

Le problème est que ce message date de 2011. C'est pourquoi j'ai posé cette question.Il peut être déjà dépassé –