Style
WPF中关于Style的作用,我们从一个简单的例子开始:
<UniformGrid>
<Button
Width="120"
Height="32"
Background="Blue">
Button1
</Button>
<Button
Width="120"
Height="32"
Background="Blue">
Button2
</Button>
<Button
Width="120"
Height="32"
Background="Blue">
Button3
</Button>
<Button
Width="120"
Height="32"
Background="Blue">
Button4
</Button>
</UniformGrid>
例子中,我们有4个Button, 都设置了宽高和背景色:
<Button
Width="120"
Height="32"
Background="Blue"/>
这是抄自微软MSDN的一句话:
You can think of a Style as a convenient way to apply a set of property values to multiple elements.
来源:Styles and templates - WPF .NET | Microsoft Learn
译:可以把Style看成是将【一组属性值】应用到【多个不同元素】的一种便利方式。
<UserControl.Resources>
<Style x:Key="BLUE_BTN" TargetType="{x:Type Button}">
<Setter Property="Width" Value="120" />
<Setter Property="Height" Value="32" />
<Setter Property="Background" Value="Blue" />
</Style>
</UserControl.Resources>
<UniformGrid>
<Button Style="{StaticResource BLUE_BTN}">
Button1
</Button>
<Button Style="{StaticResource BLUE_BTN}">
Button2
</Button>
<Button Style="{StaticResource BLUE_BTN}">
Button3
</Button>
<Button Style="{StaticResource BLUE_BTN}">
Button4
</Button>
</UniformGrid>
ControlTemplates
WPF中ControlTemplate定义了控件的外观,下面是一个例子通过重写Button的Template实现IconButton.
<Button Width="48" Height="48">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<Image x:Name="img" Source="image/play.png" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Trigger.Setters>
<Setter TargetName="img" Property="Source" Value="image/pause.png" />
</Trigger.Setters>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
Triggers
当属性值发生变化或引发事件时,触发器设置属性或启动动作(例如动画)。Style,ControlTemplate和DataTemplate都有触发器。
PropertyTriggers
<Window.Resources>
<!-- .... other resources .... -->
<Style TargetType="ListBoxItem">
<Setter Property="Opacity" Value="0.5" />
<Setter Property="MaxHeight" Value="75" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Trigger.Setters>
<Setter Property="Opacity" Value="1.0" />
</Trigger.Setters>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
事件触发器和故事板
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Width"
To="64"
Duration="0:0:0.2" />
<DoubleAnimation
Storyboard.TargetProperty="Height"
To="64"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" Duration="0:0:0.2" />
<DoubleAnimation Storyboard.TargetProperty="Height" Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Button.Style>