web-dev-qa-db-fra.com

Quelle est la particularité de Generic.xaml?

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 sur Google, il semble que je ne reçoive que des articles de blog et des questions sur le forum qui me sont parvenus - je ne peux pas sembler tomber sur quelque chose de vraiment autoritaire et clair.

Quelle est la différence entre Generic.xaml et MyRandomlyNamedResourceDictionary.xaml? Il semble que dans les deux cas, je dois faire référence à 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 Generic.xaml procure-t-il exactement? Cela a-t-il un sens si je n'essaie pas de donner à ma candidature plusieurs "looks" (c'est-à-dire si je n'ai qu'un seul thème)?

144
devuxer

Chaque contrôle de WPF a un style par défaut qui fournit, entre autres choses, le ControlTemplate par défaut du contrôle. WPF recherche le style par défaut dans un dictionnaire de ressources spécial du dossier Thèmes du même assembly que le contrôle. La clé pour le style par défaut est fournie par le Control.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. sous Vista utilisant le thème Aero, le dictionnaire s'appelle Aero.NormalColor.xaml, on XP), le thème par défaut est Luna.NormalColor.xaml. Si le style ne figure pas dans le dictionnaire de thèmes , il recherche dans Generic.xaml des contrôles dont l’apparence ne dépend pas du thème.

Ceci s’applique uniquement aux 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 et en appelant DefaultStyleKeyProperty.OverrideMetadata dans le constructeur statique, mais vous devez ensuite fournir le style complet, y compris ControlTemplate.

Notez que vous pouvez indiquer à WPF de rechercher votre style par défaut dans un assemblage externe à l'aide de l'attribut ThemeInfo. L'assemblée externe doit être nommée <YourAssembly>.<ThemeName>. dll par exemple PresententationFramework.Aero.dll.

143
Phil Devaney

Pour un generic.xaml fichier (insensible à la casse) pour être quelque chose de spécial, deux conditions doivent être remplies:

  • Il doit être dans le sous-dossier Thèmes du projet.
  • L’Assemblée doit être marquée avec le ThemeInfoAttribute (généralement dans AssemblyInfo.cs)

Il sert ensuite 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 ses types TargetType et x: Key en tant que type de contrôle à styler.

Si vous souhaitez ajouter des thèmes entiers et le changement de thème à votre application, ce qui est accompli avec un certain codage, cette technique définit simplement le dictionnaire de ressources par défaut.

98
Kenan E. K.