2011-01-09 3 views
7

Non riesco a impostare un colore di sfondo predefinito per tutte le mie finestre nella mia applicazione. Qualcuno sa come fare questo?Come si definisce il colore di sfondo predefinito per le istanze di finestra in un ResourceDictionary condiviso?

Attualmente sto impostando un tema nel mio file App.xaml come questo.

<Application> 
    <Application.Resources> 
     <ResourceDictionary Source="Themes/SomeTheme.xaml" /> 

Questo in pratica definisce la mia intera applicazione.

All'interno di SomeTheme.xaml Sto cercando di impostare un colore predefinito per tutte le finestre come questa.

<SolidColorBrush Color="{DynamicResource MainColor}" x:Key="CommonBackgroundBrush" /> 
<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background" Value="{DynamicResource CommonBackgroundBrush}" /> 
</Style> 

Questa sintassi è completamente ignorato per i derivati ​​di tipo Window.

C'è un modo per forzare lo stile da applicare a tutte le derivate di Window?

La cosa strana di questa sintassi è che in realtà mostra il colore corretto nella finestra di anteprima del design VS.

risposta

6

Le finestre non sono istanze di Window, sono istanze di classi derivate da Window. Quindi penso che dovrai elencarli tutti, ma puoi usare BasedOn per aiutare.

+0

Questo è un buon punto ... ma ancora, ci deve essere un modo per impostare tutto ciò che deriva da 'Finestra'. In effetti, l'anteprima XAML mostra lo sfondo impostato. – Nicholas

+0

Questo è un artefatto del modo in cui il designer lavora. ** ** crea un'istanza di 'Window' in modo tale che il code-behind non debba essere compilato per poter progettare. –

+0

Beh, dannazione. Grazie per queste informazioni ... quindi stai dicendo che non c'è modo di forzare tutti i derivati ​​a applicare il tema della loro classe base? – Nicholas

4

Se non c'è davvero alcuna eredità reale, questo potrebbe essere così semplice come si può fare:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <SolidColorBrush Color="Blue"/>   
     </Setter.Value> 
    </Setter> 
</Style> 
<Style TargetType="{x:Type local:MainWindow}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:Dialogue}" BasedOn="{StaticResource {x:Type Window}}"/> 
... 

Almeno non è necessario copiare tutto lo stile in questo modo

+0

Penso che questa sia una buona alternativa. È un peccato che devo dichiararli esplicitamente. – Nicholas

+0

In realtà, non riesco a farlo funzionare ... sei sicuro che sia valido? – Nicholas

+0

Ho provato e ha funzionato per me, forse qualcosa sul tema generale è diverso. –

4

Lascia la tua stile un x:Key,

<Style x:Key="WindowStyle" TargetType="{x:Type Window}"> 

e quindi fare riferimento in ogni finestra si dovrebbe applicare a:

<Window x:Class="WpfApplication1.MainWindow" ... Style="{StaticResource WindowStyle}"> 
+0

Sì, stavo cercando di evitarlo. Voglio impostare gli stili in un unico posto. – Nicholas

+1

@Nicholas Posso chiederti perché non vuoi impostare uno stile di riferimento? Personalmente preferisco avere il pieno controllo su quale stile si applica a quale controllo, specialmente dopo che ho avuto questo episodio di ButtonStyle: un lunedì mattina sono arrivato in ufficio e ho scoperto che qualcuno aveva incasinato lo stile dei miei DatePickers. Mi ci è voluto tutta la mattina per capire che mi sono incasinato. Il venerdì prima avevo definito uno stile predefinito per i pulsanti. Ma DatePicker contiene un pulsante come PART, lo stile è stato applicato anche a quello. Ho deciso che le chiavi sono tuoi amici, li salvi a tuo rischio e pericolo :-) – TomBot

+0

Non c'è niente di sbagliato con le chiavi. In realtà il tuo esempio è buono, ma voglio evitare di fare riferimento agli stili di ogni pagina. Volevo davvero uno stile implicito, ma immagino che non sia possibile. Impostandolo sul tipo (come nell'esempio di H.B), posso centralmente modellare le mie pagine nella stessa risorsa ... che è un'idea interessante per me. Quindi no, non sto saltando le chiavi, in questo caso non mi danno quello che voglio. A dire il vero, Targeting the Type non mi dà quello che voglio, ma sembra che dovrò conviverci. – Nicholas

1

Sono nuovo di tutto questo quindi ecco i miei 5 pence. ho cambiato lo sfondo per la griglia ... non so se ci sono problemi facendo in questo modo :)

<Style TargetType="{x:Type Grid}"> 
    <Setter Property="Background" Value="#FFECE9D8"/> 
</Style>