Puoi definire più TargetTypes per uno stile XAML?
Domanda
In HTML / CSS è possibile definire uno stile che può essere applicato a molti tipi di elementi, ad esempio:
.highlight {
color:red;
}
può essere applicato sia a P che a DIV, ad es .:
<p class="highlight">this will be highlighted</p>
<div class="highlight">this will also be highlighted</div>
ma in XAML sembra che tu debba definire TargetType per gli stili, altrimenti otterrai un errore:
<Style x:Key="formRowLabel" TargetType="TextBlock">
c'è un modo per consentire ad uno stile XAML di essere applicato a più elementi o addirittura di lasciarlo aperto come nei CSS?
Soluzione
I setter negli stili WPF sono controllati durante il tempo di compilazione; Gli stili CSS vengono applicati in modo dinamico.
Devi specificare un tipo in modo che WPF possa risolvere le proprietà nei setter con le proprietà di dipendenza di quel tipo.
È possibile impostare il tipo di destinazione su classi di base che contengono le proprietà desiderate e quindi applicare quello stile alle classi derivate. Ad esempio, è possibile creare uno stile per gli oggetti Control e quindi 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"/>
Altri suggerimenti
<!-- 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 per dichiarare uno stile possano rispondere alla tua domanda. Nel primo, non è stato specificato TargetType, ma i nomi delle proprietà sono preceduti da "Etichetta". Nel secondo, lo stile viene creato per gli oggetti Etichetta.
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>
Volevo applicare uno stile a Textblock e TextBox ma la risposta selezionata non ha funzionato per me perché Textblock non eredita da Control, nel mio caso volevo influenzare 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}"/>
Funziona con la proprietà Visibility perché entrambi gli elementi ereditano da Frameworkelement e la proprietà è definita lì. Ovviamente questo non funzionerà per le proprietà definite solo in Control, puoi cercare nella struttura gerarchica e provare a trovare una classe base, comunque ho pensato che questo potesse aiutare qualcuno dato che si tratta di un risultato di ricerca superiore e la risposta selezionata è un po 'incompleta.
Esiste una risposta alternativa alla domanda. Puoi lasciare il parametro TargetType completamente fuori dallo stile che gli permetterà di applicarlo a vari controlli diversi, ma solo se aggiungi il prefisso al nome della proprietà con " Control. & Quot;
<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 tenta di impostare ItemsSource dire, fallirebbe perché non c'è Control.ItemsSource
Ho funzionato
<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>