J'ai essayé de comprendre comment organiser mes fichiers ResourceDictionary pour les réutiliser et les partager avec d'autres membres de mon équipe.
Je n'arrête pas de tomber sur "Generic.xaml", mais si je regarde sur MSDN pour Generic.xaml ou si je fais simplement une recherche Google, il me semble que je ne reçois que des articles de blog et des questions de forum qui le mentionnent - je n'arrive pas à le faire frappé sur tout ce qui fait vraiment autorité et clair.
Quelle est la différence entre Generic.xaml et MyRandomlyNamedResourceDictionary.xaml? Il semble que dans les deux cas, je dois référencer les ResourceDictionaries stockés dans des bibliothèques avec l'attribut Source. Par exemple,:
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
Alors, quel avantage offre Generic.xaml exactement? Cela a-t-il une raison d'être si je n'essaye pas de donner à mon application plusieurs «regards» (c'est-à-dire si je n'ai qu'un seul thème)?
Réponses:
Chaque contrôle dans WPF a un style par défaut qui fournit, entre autres, la valeur par défaut du contrôle
ControlTemplate
. WPF recherche le style par défaut dans un dictionnaire de ressources spécial dans le dossier Thèmes du même assembly que le contrôle. La clé du style par défaut est fournie par laControl.DefaultStyleKey
propriété de dépendance, dont la valeur par défaut est remplacée dans chaque sous-classe de Control.Le nom du dictionnaire de ressources dépend du thème Windows actuel, par exemple sur Vista utilisant le thème Aero, le dictionnaire s'appelle Aero.NormalColor.xaml, sur XP en utilisant le thème par défaut, c'est Luna.NormalColor.xaml. Si le style n'est pas trouvé dans le dictionnaire de thèmes, il cherche dans Generic.xaml c'est-à-dire des contrôles dont l'apparence ne dépend pas du thème.
Ceci s'applique uniquement à tous les contrôles personnalisés que vous avez définis, c'est-à-dire aux classes dérivées de Control, directement ou indirectement. Vous pouvez modifier le style par défaut d'un contrôle standard en dérivant de celui-ci et en appelant
DefaultStyleKeyProperty.OverrideMetadata
le constructeur statique, mais vous devez ensuite fournir le style complet, y compris ControlTemplate.Notez que vous pouvez indiquer à WPF de rechercher dans un assembly externe votre style par défaut à l'aide de l'attribut ThemeInfo. L'assembly externe doit être nommé
<
YourAssembly>
.<
ThemeName>
.dll, par exemple PresententationFramework.Aero.dll.la source
Pour qu'un
generic.xaml
fichier (insensible à la casse) soit quelque chose de spécial, deux conditions doivent être remplies:ThemeInfoAttribute
(généralement enAssemblyInfo.cs
)Ensuite, il sert d'emplacement de recherche par défaut pour tous les styles par défaut que vous souhaitez appliquer à vos contrôles. Notez également que pour qu'un style soit le style par défaut, il doit déclarer à la fois son TargetType et x: Key comme type de contrôle à styliser.
Si vous souhaitez ajouter des thèmes entiers et un changement de thème à votre application, ce qui est accompli avec un peu de codage, cette technique définit simplement le dictionnaire de ressources par défaut.
la source
x:Key
par écrit<Button Style="{StaticResource MyButtonStyle}" />
? Que se passe-t-il si le ResourceDictionary contient plusieurs styles dont TargetType est "Button"? Merci.h1 {color:#00ff00}
?