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 diDynamicResource
, 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>