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


153

Ho cercato di capire come organizzare i miei file ResourceDictionary per il riutilizzo e la condivisione con altri membri del mio team.

Continuo a trovare "Generic.xaml", ma se cerco MSDN per Generic.xaml o cerco semplicemente una ricerca su Google, mi sembra di ricevere solo post sul blog e domande sul forum che mi capitano di menzionarlo - non riesco a colpire qualsiasi cosa veramente autorevole e chiara.

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

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

Che vantaggio offre esattamente Generic.xaml? Ha qualche scopo se non sto cercando di dare alla mia applicazione più "look" (cioè se ho solo un tema)?


6
Non è necessario unire nel dizionario generic.xaml nel codice, se lo si utilizza con controlli personalizzati (anziché controlli utente).
Eternal21,

Risposte:


152

Ogni controllo in WPF ha uno stile predefinito che fornisce, tra le altre cose, il valore predefinito del controllo ControlTemplate. WPF cerca lo stile predefinito in un dizionario di risorse speciale nella cartella Temi nello stesso assembly del controllo. La chiave per lo stile predefinito è fornita dalla Control.DefaultStyleKeyproprietà di dipendenza, il cui valore predefinito viene sovrascritto in ogni sottoclasse di Controllo.

Il nome del dizionario delle risorse dipende dal tema corrente di Windows, ad es. Da 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 dei temi, cerca in Generic.xaml, ovvero i controlli il cui aspetto non dipende dal tema.

Questo vale solo per tutti i controlli personalizzati definiti, ad esempio le classi derivate dal controllo, direttamente o indirettamente. È possibile modificare lo stile predefinito per un controllo standard derivando da esso e chiamando DefaultStyleKeyProperty.OverrideMetadatail costruttore statico, ma è quindi necessario fornire lo stile completo incluso ControlTemplate.

Nota che puoi dire a WPF di cercare in un assembly esterno il tuo stile predefinito usando l'attributo ThemeInfo. L'assembly esterno deve essere denominato <YourAssembly >. <ThemeName >.dll ad esempio PresententationFramework.Aero.dll.


Grazie Phil. Quindi stai dicendo che se volessi solo fornire un nuovo ControlTemplate per un normale controllo Button (ovvero, non scrivere la mia classe speciale che deriva da Button), questo non sarebbe considerato parte di un "tema"?
Devuxer

Sì, se desideri semplicemente riprogrammare o ridisegnare un controllo standard, allora usi il normale elemento Risorse a livello UserControl / Window / Application / qualunque. È possibile utilizzare uno stile con una chiave implicita ( msdn.microsoft.com/en-us/library/… ) per modificare tutti i controlli di un determinato tipo.
Phil Devaney,

@Zaheylu Funziona ora (penso che MS stesse aggiornando i loro documenti)
Alan McBee - MSFT

104

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

  • Deve trovarsi nella cartella sub-root Temi del progetto
  • Il gruppo deve essere contrassegnato con ThemeInfoAttribute(di solito 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 affinché uno stile sia predefinito, deve dichiarare sia TargetType che x: Key come il tipo di controllo che deve essere designato.

Se si desidera aggiungere interi temi e il passaggio di temi alla propria applicazione, che viene realizzato con un po 'di codice, questa tecnica definisce semplicemente il dizionario delle risorse predefinito.


3
Puoi chiarire cosa intendi con "stili predefiniti"? Questo significa che tutti i pulsanti assumeranno automaticamente uno stile il cui TargetType è "Button"? O devo ancora fare riferimento x:Keyscrivendo <Button Style="{StaticResource MyButtonStyle}" />? Cosa succede se ResourceDictionary contiene più di uno stile il cui TargetType è "Button"? Grazie.
devuxer

3
Un'altra domanda per aiutarmi a risolvere il problema: Generic.xaml è l'equivalente WPF di un file CSS che ha definito l'aspetto predefinito di diversi elementi, ad esempio h1 {color:#00ff00}?
Devuxer

3
Sì, lo stile predefinito si applicherebbe senza fare esplicito riferimento alla chiave e due stili identici darebbero l'errore che ci sono due chiavi identiche nel dizionario. E sì, potresti pensarci in questo modo, per quanto riguarda il comportamento predefinito.
Kenan EK,

3
Volevo solo aggiungere che, sebbene sia vero che esistono restrizioni speciali sul file generic.xaml stesso, la voce del dizionario all'interno di generic.xaml può essere un dizionario unito le cui voci possono fare riferimento a qualsiasi cosa.
Tormod,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.