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.
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
@ mm8 J'ai édité le point 1 pour le rendre plus facile à comprendre, merci d'avoir signalé mon erreur –
@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'? –