2013-03-22 16 views
17

Voglio utilizzare il tema personalizzato nella mia applicazione e, per quanto ne so, posso farlo utilizzando il dizionario delle risorse e facendolo riferimento in App.xaml. Stili sarebbero sovrascrivere le impostazioni predefinite in questo modo:Come estendere anziché sostituire gli stili WPF

<Style TargetType="{x:Type Label"> 
    <Setter Property="Foreground" Value="Green" /> 
</Style> 

Ora, come immagino lo stile di etichetta predefinita viene sovrascritto con i stessi valori, ma tutti i miei font etichette sono verdi. Il problema inizia quando voglio ridisegnare un'etichetta da qualche altra parte. Quando ho voglia di cambiare qualche altra proprietà nella mia griglia come questo

<Grid.Resources> 
    <Style TargetType="{x:Type Label"> 
     <Setter Property="FontSize" Value="28" /> 
    </Style> 
</Grid.Resources> 

Tutte le etichette dentro la mia griglia stanno perdendo il loro colore di primo piano e hanno ancora una volta uno di default (non ci ho ignorare le impostazioni predefinite nel passaggio precedente?). Dopo alcuni tentativi ho scoperto che per farlo correttamente devo aggiungere un'altra proprietà alla dichiarazione StyleBasedOn={StaticResource {x:Type Label}}" e funziona. Questo è un po 'strano per me perché ora dovrò ripetere lo stesso codice BasedOn in tutta l'app e questo non è il modo in cui funziona lo styling - questo dovrebbe essere fatto automaticamente! Ad esempio in HTML + gli stili CSS vengono ereditati e uniti e in WPF vengono sostituiti ...

Si noti che quando non si usano i controlli di stili si ottiene ancora il proprio aspetto da alcuni (Temi di sistema?). Come posso dire loro di cercare i valori predefiniti da qualche altra parte così senza alcun codice aggiuntivo sugli stili penseranno che dovrebbero essere verdi per impostazione predefinita?

Esiste un modo per automatizzare l'impostazione della proprietà BasedOn? O forse è meglio fare questo in modo eccessivo?

+0

ho trovato questione similliar con risposta qui http://stackoverflow.com/questions/2377055/override-overriden-wpf-theme – labm0nkey

+0

Ho appena riletto il tuo problema, e mi chiedevo se avete usato dizionario delle risorse? Sembra che tu voglia essere in grado di definire uno stile, e semplicemente applicare quello stile ai tuoi elementi xaml, giusto? Bene, se si imposta un dizionario risorse, è possibile avere lo stile di base che imposta tutte le etichette con un in primo piano verde, quindi un altro stile basato su quello che imposta la dimensione del carattere, il tutto contenuto in un file di codice che viene utilizzato come dizionario. Quindi in ogni elemento xaml, assegni lo stile come 'Style = "{StaticResource LargeGreen}"' o come lo chiami. Cercherò di modificare la mia risposta con un esempio. – Zack

risposta

20

Ho avuto lo stesso problema. Ho usato la risposta di Zack e l'ho migliorata come se seguissi così se non specifichi uno stile l'impostazione predefinita è ancora presa in considerazione. È fondamentalmente ciò che avresti fatto, ma solo una volta nel ResourceDictionary.

<Window x:Class="TestWpf.RandomStuffWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Random Stuff Window"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <!-- Default Label style definition --> 
     <Style TargetType="{x:Type Label}"> 
     <Setter Property="Foreground" Value="Green" /> 
     </Style> 
     <!-- Extending default style --> 
     <Style TargetType="{x:Type Label}" 
      x:Key="LargeGreenForegroundLabel" 
      BasedOn="{StaticResource {x:Type Label}}"> 
     <Setter Property="FontSize" Value="28" /> 
     </Style> 
    </ResourceDictionary> 
    </Window.Resources> 
    <StackPanel> 
    <Button Click="Button_Click">Click</Button> 
    <Label Content="GreenForegroundLabel" /> <!-- Uses default style --> 
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
      Content="LargeGreenForegroundLabel" /> 
    </StackPanel> 
</Window> 
8

Wpf ha diversi livelli di stili, applicati in ordine globale> locale. Uno stile impostato direttamente su un controllo sovrascriverà uno stile impostato globalmente, come nell'esempio. Stavo cercando di trovare un elenco di tutti i diversi luoghi in cui un controllo cerca i suoi stili, ma al momento non riesco a trovarne uno. Per quanto ne so, sarà necessario utilizzare la proprietà BasedOn per ereditare uno stile e non ignorare completamente le proprietà di quello stile con lo stile impostato localmente.

Ecco un esempio di un dizionario risorse con stili basati su un altro stile, in modo da non ripetere ripetutamente il collegamento BasedOn, è possibile semplicemente impostare lo stile sull'elemento specifico che si desidera avere quello stile.

<Window x:Class="TestWpf.RandomStuffWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Random Stuff Window"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <Style TargetType="{x:Type Label}" 
      x:Key="GreenForegroundLabel"> 
     <Setter Property="Foreground" Value="Green" /> 
     </Style> 
     <Style TargetType="{x:Type Label}" 
      x:Key="LargeGreenForegroundLabel" 
      BasedOn="{StaticResource GreenForegroundLabel}"> 
     <Setter Property="FontSize" Value="28" /> 
     </Style> 
    </ResourceDictionary> 
    </Window.Resources> 
    <StackPanel> 
    <Button Click="Button_Click">Click</Button> 
    <Label Style="{StaticResource GreenForegroundLabel}" 
      Content="GreenForegroundLabel" /> 
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
      Content="LargeGreenForegroundLabel" /> 
    </StackPanel> 
</Window>