Zoeken…
Opmerkingen
Inleidende opmerkingen
In WPF definieert een stijl de waarden van een of meer afhankelijkheidseigenschappen voor een bepaald visueel element. Stijlen worden overal in de applicatie gebruikt om de gebruikersinterface consistenter te maken (bijvoorbeeld om alle dialoogknoppen een consistente grootte te geven) en om bulkwijzigingen gemakkelijker te maken (bijvoorbeeld de breedte van alle knoppen te wijzigen.)
Stijlen worden meestal gedefinieerd in een ResourceDictionary
op een hoog niveau in de applicatie (bijvoorbeeld in App.xaml of in een thema), dus het is app-breed beschikbaar, maar ze kunnen ook worden gedefinieerd voor een enkel element en de onderliggende elementen, bijvoorbeeld het toepassen van een stijl voor alle TextBlock
elementen in een 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>
Belangrijke aantekeningen
- De locatie waar de stijl is gedefinieerd, is van invloed op waar deze beschikbaar is.
- Voorwaartse verwijzingen kunnen niet worden opgelost door
StaticResource
. Met andere woorden, als u een stijl definieert die afhankelijk is van een andere stijl of bron in een bronnenwoordenboek, moet deze worden gedefinieerd achter / onder de bron waarvan deze afhankelijk is. -
StaticResource
is de aanbevolen manier om naar stijlen en andere bronnen te verwijzen (om prestatie- en gedragsredenen), tenzij u specifiek het gebruik vanDynamicResource
, bijvoorbeeld voor thema's die tijdens runtime kunnen worden gewijzigd.
Middelen
MSDN heeft grondige artikelen over stijlen en bronnen die meer diepgang hebben dan hier mogelijk is.
Een benoemde stijl definiëren
Voor een benoemde stijl moet de eigenschap x:Key
worden ingesteld en is deze alleen van toepassing op elementen die hier expliciet naar verwijzen:
<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>
Een impliciete stijl definiëren
Een impliciete stijl is van toepassing op alle elementen van een bepaald type binnen het bereik. Een impliciete stijl kan x:Key
weglaten, omdat deze impliciet hetzelfde is als de eigenschap TargetType
de stijl.
<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>
Overerving van een stijl
Het is gebruikelijk om een basisstijl te hebben die eigenschappen / waarden definieert die worden gedeeld tussen meerdere stijlen die tot hetzelfde besturingselement behoren, vooral voor iets als TextBlock
. Dit wordt bereikt door de eigenschap BasedOn
. Waarden worden overgenomen en kunnen vervolgens worden genegeerd.
<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>
In het bovenstaande voorbeeld wordt elke TextBlock
met de stijl WarningTextBlockStyle
gepresenteerd als 12 px Arial in rood en vetgedrukt.
Omdat impliciete stijlen een impliciete x:Key
die overeenkomt met hun TargetType
, kunt u deze ook erven:
<!-- 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>