Cosa c’è di così speciale in Generic.xaml?

Ho cercato di capire come organizzare i file ResourceDictionary per riutilizzarli e condividerli con altri membri del mio team.

Continuo a incontrare “Generic.xaml”, ma se guardo su MSDN per Generic.xaml o semplicemente faccio una ricerca su Google, sembra che solo io abbia i post del blog e le domande del forum che ne parlano – non riesco a sembrare colpire qualsiasi cosa veramente autorevole e chiara.

Qual è la differenza tra Generic.xaml e MyRandomlyNamedResourceDictionary.xaml? Sembra che in entrambi i casi, devo fare riferimento a ResourceDictionaries memorizzati nelle librerie con l’attributo Source. Per esempio,:

 <ResourceDictionary Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"  

Quindi quale vantaggio offre Generic.xaml esattamente? Ha qualche scopo se non sto cercando di dare alla mia applicazione più “sguardi” (cioè, se ho un solo tema)?

Ogni controllo in WPF ha uno stile predefinito che fornisce, tra le altre cose, il ControlTemplate predefinito del Control. WPF cerca lo stile predefinito in un dizionario di risorse speciali nella cartella Temi nello stesso assieme del controllo. La chiave per lo stile predefinito è fornita dalla proprietà di dipendenza Control.DefaultStyleKey , il cui valore predefinito è sovrascritto in ciascuna sottoclass di Control.

Il nome del dizionario delle risorse dipende dal tema corrente di Windows, ad es. Su Vista usando il tema Aero, il dizionario si chiama Aero.NormalColor.xaml, su XP usando il tema predefinito è Luna.NormalColor.xaml. Se lo stile non è presente nel dizionario del tema, viene visualizzato in Generic.xaml, ad es. Per i controlli il cui aspetto non dipende dal tema.

Questo si applica solo ai controlli personalizzati che hai definito, ad esempio le classi derivate da Control, direttamente o indirettamente. È ansible modificare lo stile predefinito per un controllo standard derivando da esso e chiamando DefaultStyleKeyProperty.OverrideMetadata nel costruttore statico, ma è necessario fornire lo stile completo, incluso ControlTemplate.

Si noti che è ansible indicare a WPF di cercare in un assieme esterno lo stile predefinito utilizzando l’attributo ThemeInfo. L’assembly esterno deve essere denominato < YourAssembly > . < ThemeName > .dll es. PresententationFramework.Aero.dll.

Affinché un file generic.xaml (senza distinzione tra maiuscole e minuscole) sia qualcosa di speciale, devono essere soddisfatte due condizioni:

  • Deve essere nella cartella radice secondaria di Themes nel progetto
  • L’assembly deve essere contrassegnato con ThemeInfoAttribute (in genere in AssemblyInfo.cs )

Quindi funge da posizione di ricerca predefinita per tutti gli stili predefiniti che si desidera applicare ai Controlli. Si noti inoltre che, per uno stile predefinito, è necessario dichiarare sia il suo TargetType che x: Key come il tipo di controllo da designare.

Se si desidera aggiungere interi temi e passaggi di temi alla propria applicazione, ciò è ansible con alcune codifiche, questa tecnica definisce semplicemente il dizionario delle risorse predefinito.