2009-06-22 4 views
39

Stavo solo vagando un po 'in WPF e volevo che tutti gli elementi della mia finestra condividessero lo stesso margine. ho scoperto che tutti i controlli che sono in grado di avere un margine di derivano da FrameworkElement così ho provato quanto segue:Impostazione di una proprietà TargetType di uno stile su una classe base

<Window.Resources> 
<Style TargetType="{x:Type FrameworkElement}"> 
    <Setter Property="Margin" Value="10" /> 
</Style> 
</Window.Resources> 

E, questo non funziona. Posso applicare questo a tutti i pulsanti, ma non a tutti gli elementi che derivano da Button. Mi manca qualcosa o semplicemente non è possibile?

Sono l'unico a sentire come usare CSS per WPF sarebbe stata una buona idea?

+2

So che questo è un vecchio post ma non sei l'unico. I CSS non sono perfetti, ma sarebbe stata una buona idea usare qualcosa che non fosse _worse_ rispetto ai CSS. –

risposta

54

Sfortunatamente, non è possibile applicare gli stili al tipo base FrameworkElement; mentre WPF ti consente di scrivere lo stile, non lo applicherà ai controlli che ne derivano. Sembra che ciò si applichi anche ai sottotipi di FrameworkElement, ad es. ButtonBase, il supertipo di Button/ToggleButton/RepeatButton.

È ancora possibile utilizzare l'ereditarietà, ma sarà necessario utilizzare la sintassi esplicita BasedOn per applicarla ai tipi di controllo a cui si desidera applicare.

<Window.Resources> 
    <Style TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Margin" Value="10" /> 
    </Style> 

    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 

</Window.Resources> 

+1

Grazie. Ci ho pensato anch'io, ma mi sembra terribilmente lento se mi piacerebbe che uno stile fosse applicato a TUTTI gli elementi che si trovano su una finestra. – Tigraine

+4

Non funziona qui. Ricevo una XamlParseException che dice che il TargetType non corrisponde all'altro tipo. L'ho provato sulla mia classe derivata da Button e sul pulsante normale. – ygoe

+1

Quindi c'è un modo migliore per applicare uno stile globale a TUTTI i controlli nell'app? – Shimmy

7

Il problema è che quando la ricerca di uno stile di WPF non esegue la ricerca attraverso tutte le classi da cui deriva quella attuale. Tuttavia puoi dare allo stile una chiave e applicarla a tutti gli elementi per i quali desideri avere una proprietà comune. Se una proprietà è specificata nello stile che non può essere applicato all'elemento che si sta disegnando, viene ignorata.