2009-04-29 8 views
51

In HTML/CSS è possibile definire uno stile che può essere applicata a molti tipi di elementi, ad esempio:Puoi definire più TargetTypes per uno stile XAML?

.highlight { 
    color:red; 
} 

può essere applicato sia P e DIV, ad esempio:

<p class="highlight">this will be highlighted</p> 
<div class="highlight">this will also be highlighted</div> 

ma in XAML ti sembra di avere a definire la TargetType per gli stili, altrimenti si ottiene un errore:

<Style x:Key="formRowLabel" TargetType="TextBlock"> 

c'è un modo per consentire uno stile di XAML da applicare agli elementi multipli o posta veniamo a lasciarlo aperto come nei CSS?

risposta

59

I setter negli stili WPF vengono controllati durante la compilazione; Gli stili CSS sono applicati dinamicamente.

È necessario specificare un tipo in modo che WPF possa risolvere le proprietà nei setteri delle proprietà di dipendenza di quel tipo.

È possibile impostare il tipo di destinazione su classi base che contengono le proprietà desiderate e quindi applicare tale stile alle classi derivate. Ad esempio, è possibile creare uno stile per gli oggetti di controllo e poi applicarlo a più tipi di controlli (Button, TextBox, CheckBox, ecc)

<Style x:Key="Highlight" TargetType="{x:Type Control}"> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

...

<Button Style="{StaticResource Highlight}" Content="Test"/> 
<TextBox Style="{StaticResource Highlight}" Text="Test"/> 
<CheckBox Style="{StaticResource Highlight}" Content="Test"/> 
+0

Sì, ma cosa succede se si desidera applicarlo a pulsanti e caselle di testo, ma non caselle di controllo? –

+1

Puoi applicarlo a qualsiasi cosa desideri. Questo stile deve essere applicato ai controlli. Se verrà applicato solo a TUTTI i controlli se rimuovi il 'x: Key = "Evidenzia" ". Se non vuoi che venga applicato a CheckBox, lascia la proprietà 'Style ='. –

+3

Chiarimento: Rimuovi 'x: Key = "Evidenzia" "dalla definizione dello stile per applicare lo stile a TUTTE le istanze di quel tipo. Con la chiave, rimuovere "Style =" {StaticResource Highlight} "" dal controllo per rimuovere lo stile da quel controllo. –

-2

ho ottenuto questo lavoro

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> 
    <Setter Property="Background" Value="Black" /> 

    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Background=" Value="Red" /> 
     </Style> 
     </Style.Resources> 

</Style> 
3

C'è una risposta alternativa alla domanda. È possibile lasciare il parametro TargetType completamente fuori dallo stile che gli consentirà di applicare a vari controlli diversi, ma solo se si prefissa il nome della proprietà con "Control".

<Style x:Key="Highlight"> 
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

Ovviamente, questo funziona solo per le proprietà della classe di controllo di base. Se si è tentato di impostare ItemsSource dire, fallirebbe perché non c'è Control.ItemsSource

+1

In questo modo si sta indicando implicitamente un TargetType; e come dici tu funziona solo se l'elemento a cui è applicato è un controllo. Pertanto, questo non offre nulla lasciando il TargetType impostato su Controllo. –

29
<!-- Header text style --> 
<Style x:Key="headerTextStyle"> 
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> 
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> 
    <Setter Property="Label.FontWeight" Value="Bold"></Setter> 
    <Setter Property="Label.FontSize" Value="18"></Setter> 
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter> 
</Style> 

<!-- Label style --> 
<Style x:Key="labelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Margin" Value="0,0,0,5" /> 
</Style> 

Penso che entrambi questi metodi di dichiarare uno stile potrebbe rispondere alla tua domanda. Nel primo, non è specificato alcun TargetType, ma i nomi delle proprietà sono preceduti da "Etichetta". Nella seconda, lo stile viene creato per gli oggetti Label.

Un altro metodo per farlo è:

<UserControl.Resources> 
    <Style x:Key="commonStyle" TargetType="Control"> 
    <Setter Property="FontSize" Value="24"/> 
    </Style> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> 
</UserControl.Resources> 
+0

headerTextStyle può ancora essere applicato solo a Label e alle classi che ne derivano, quindi non si guadagna nulla dall'uscita da TargetType. –

+0

@ Steve: Penso che questo potrebbe rispondere al tuo dubbio. – Gaurang

+0

per il primo esempio, è possibile sostituire 'Label' con' UIElement' per farlo funzionare in genere su più tipi di controlli. – Julien

2

ho voluto applicare uno stile a un blocco di testo e una casella di testo ma la risposta selezionata non ha funzionato per me, perché TextBlock non eredita da Control, in il mio caso ho voluto interessare la proprietà Visibilità, quindi ho usato FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 

Questo funziona per la proprietà Visibility perché entrambi gli elementi ereditano da FrameworkElement e la proprietà è definita lì. Ovviamente questo non funziona per le proprietà definite solo in Control, puoi cercare l'albero della gerarchia e provare a trovare una classe base, comunque ho pensato che questo potesse aiutare qualcuno dato che questo è un risultato di ricerca superiore e la risposta selezionata è un po 'incompleta.

+1

yes TargetType = "{x: Type FrameworkElement}" ha funzionato per me non il 'controllo' –

Problemi correlati