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?

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top