Ricerca…


Osservazioni

Osservazioni introduttive

In WPF, uno stile definisce i valori di una o più proprietà di dipendenza per un dato elemento visivo. Gli stili sono utilizzati in tutta l'applicazione per rendere l'interfaccia utente più coerente (ad esempio, dando a tutti i pulsanti di dialogo una dimensione consistente) e per rendere più semplici le modifiche alla rinfusa (ad esempio, cambiando la larghezza di tutti i pulsanti).

Gli stili sono tipicamente definiti in un ResourceDictionary ad un livello elevato nell'applicazione (ad esempio in App.xaml o in un tema), quindi sono disponibili in tutta l'app, ma possono anche essere definiti per un singolo elemento e i relativi figli, ad es. stile a tutti gli elementi TextBlock all'interno di uno StackPanel .

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,5,5,0"/>
            <Setter Property="Background" Value="#FFF0F0F0"/>
            <Setter Property="Padding" Value="5"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="First Child"/>
    <TextBlock Text="Second Child"/>
    <TextBlock Text="Third Child"/>      
</StackPanel>

Note importanti

  • La posizione in cui è definito lo stile influisce su dove è disponibile.
  • I riferimenti avanzati non possono essere risolti da StaticResource . In altre parole, se stai definendo uno stile che dipende da un altro stile o risorsa in un dizionario di risorse, deve essere definito dopo / sotto la risorsa da cui dipende.
  • StaticResource è il metodo consigliato per fare riferimento a stili e altre risorse (per motivi prestazionali e comportamentali), a meno che non si richieda specificamente l'utilizzo di DynamicResource , ad esempio per temi che possono essere modificati in fase di runtime.

risorse

MSDN ha articoli approfonditi su stili e risorse che hanno più profondità di quanto è possibile fornire qui.

Definire uno stile con nome

Uno stile denominato richiede che la proprietà x:Key sia impostata e si applica solo agli elementi che fanno esplicitamente riferimento a esso per nome:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="Yellow and bold!" Style="{StaticResource MyTextBlockStyle}" />
    <TextBlock Text="Also yellow and bold!" Style="{DynamicResource MyTextBlockStyle}" />
    <TextBlock Text="Plain text." />      
</StackPanel>

Definire uno stile implicito

Uno stile implicito si applica a tutti gli elementi di un determinato tipo all'interno dell'ambito. Uno stile implicito può omettere x:Key poiché è implicitamente uguale alla proprietà TargetType dello stile.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>

    <TextBlock Text="Yellow and bold!"  />
    <TextBlock Text="Also yellow and bold!" />
    <TextBlock Style="{x:Null}" Text="I'm not yellow or bold; I'm the control's default style!" />
</StackPanel>

Ereditando da uno stile

È normale che sia necessario uno stile di base che definisca proprietà / valori condivisi tra più stili appartenenti allo stesso controllo, in particolare per qualcosa come TextBlock . Ciò si ottiene utilizzando la proprietà BasedOn . I valori sono ereditati e quindi possono essere ignorati.

<Style x:Key="BaseTextBlockStyle" TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource BaseTextBlockStyle">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>

Nell'esempio precedente, qualsiasi TextBlock utilizza lo stile WarningTextBlockStyle verrà presentato come 12px Arial in rosso e in grassetto.

Poiché gli stili impliciti hanno una x:Key implicita x:Key che corrisponde al loro TargetType , puoi ereditare anche quelli:

<!-- Implicit -->
<Style TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource {x:Type TextBlock}}">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow