Quelle est la particularité de Generic.xaml?

153

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

devuxer
la source
6
Vous n'avez pas besoin de fusionner le dictionnaire generic.xaml dans votre code, si vous l'utilisez avec des contrôles personnalisés (par opposition aux contrôles utilisateur).
Eternal21

Réponses:

152

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 la Control.DefaultStyleKeyproprié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.OverrideMetadatale 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.

Phil Devaney
la source
Merci, Phil. Alors êtes-vous en train de dire que si je voulais juste fournir un nouveau ControlTemplate pour un contrôle Button normal (c'est-à-dire ne pas écrire ma propre classe spéciale qui dérive de Button), cela ne serait pas considéré comme faisant partie d'un "thème"?
devuxer
Oui, si vous souhaitez simplement remodeler ou redéfinir un contrôle standard, vous utilisez l'élément Resources normal dans UserControl / Window / Application / Quel que soit le niveau. Vous pouvez utiliser un style avec une clé implicite ( msdn.microsoft.com/en-us/library/… ) pour modifier tous les contrôles d'un certain type.
Phil Devaney
@Zaheylu Cela fonctionne maintenant (je pense que MS mettait à jour leurs documents)
Alan McBee - MSFT
104

Pour qu'un generic.xamlfichier (insensible à la casse) soit quelque chose de spécial, deux conditions doivent être remplies:

  • Il doit se trouver dans le dossier sous-racine Thèmes du projet
  • L'assemblage doit être marqué du ThemeInfoAttribute(généralement en AssemblyInfo.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.

Kenan EK
la source
3
Pouvez-vous clarifier ce que vous entendez par «styles par défaut»? Cela signifie-t-il que tous les boutons prendraient automatiquement un style dont le TargetType est "Button"? Ou dois-je toujours faire référence au x:Keypar écrit <Button Style="{StaticResource MyButtonStyle}" />? Que se passe-t-il si le ResourceDictionary contient plusieurs styles dont TargetType est "Button"? Merci.
devuxer
3
Une autre question pour m'aider à comprendre ceci: Generic.xaml est-il l'équivalent WPF d'un fichier CSS qui définit l'apparence par défaut de différents éléments, par exemple h1 {color:#00ff00}?
devuxer
3
Oui, le style par défaut s'appliquerait sans référencer explicitement la clé, et deux styles identiques donneraient l'erreur qu'il y a deux clés identiques dans le dictionnaire. Et oui, vous pourriez y penser de cette façon, en ce qui concerne le comportement par défaut.
Kenan EK
3
Je voulais juste ajouter que, bien que vrai qu'il existe des restrictions spéciales sur le fichier generic.xaml lui-même, l'entrée de dictionnaire dans generic.xaml peut être un dictionnaire fusionné dont les entrées peuvent référencer n'importe quoi.
Tormod