2009-08-04 15 views
131

Ho cercato di capire come organizzare i file ResourceDictionary per riutilizzarli e condividerli con altri membri del mio team.Cosa c'è di così speciale in Generic.xaml?

Continuo a ricevere "Generic.xaml", ma se guardo 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 capita di menzionarlo - Posso Sembra che abbia trovato qualcosa di veramente autorevole e chiaro.

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. Ad es.,:

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

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

+4

Non è necessario unire nel dizionario generic.xaml nel codice, se lo si utilizza con i controlli personalizzati (al contrario dei controlli utente). – Eternal21

risposta

128

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 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 sottoclasse di Control.

Il nome del dizionario 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 i.e per i controlli il cui aspetto non dipende dal tema.

Questo si applica solo a tutti i controlli personalizzati definiti, ad esempio le classi derivate da Control, direttamente o indirettamente. È possibile 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 è possibile 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 ad es. PresententationFramework.Aero.dll.

+0

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

+0

Sì, se si desidera semplicemente modificare il modello o ridisegnare un controllo standard, utilizzare il normale elemento Risorse in UserControl/Window/Application/Qualunque livello. È possibile utilizzare uno stile con una chiave implicita (http://msdn.microsoft.com/en-us/library/ms750613.aspx#stylesimplicitkeys) per modificare tutti i controlli di un determinato tipo. –

+0

@Phil Il collegamento non funziona più – Zaheylu

89

Per un file generic.xaml (case insensitive) per essere qualcosa di speciale, due condizioni devono essere soddisfatte:

  • deve essere in sottocartella radice i temi del progetto
  • L'assemblea devono essere contrassegnati con il ThemeInfoAttribute (di solito in AssemblyInfo.cs)

Poi serve come il percorso di ricerca di default per tutti gli stili di default 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ò è possibile con alcune codifiche, questa tecnica definisce semplicemente il dizionario risorse predefinito.

+3

Puoi chiarire cosa intendi per "stili predefiniti"?Questo significa che tutti i pulsanti assumeranno automaticamente uno stile il cui TargetType è "Button"? O devo ancora fare riferimento a 'x: Key' scrivendo'

+3

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

+2

Sì, lo stile predefinito si applica senza fare esplicitamente 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, riguardo al comportamento predefinito. –

Problemi correlati