<Window.Resources> <FontFamily x:Key="ButtonFontFamily">Times New Roman</FontFamily> <sys:Double x:Key="ButtonFontSize">18</sys:Double> <FontWeight x:Key="ButtonFontWeight">Bold</FontWeight> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <Button FontFamily="{StaticResource ButtonFontFamily}" FontSize="{StaticResource ButtonFontSize}" FontWeight="{StaticResource ButtonFontWeight}"> </Button> </Grid>这个示例可以正常工作,它将字体细节(所谓的magic number)移出的标记。但也存在两个问题。
<Window.Resources> <Style x:Key="BigFontButtonStyle"> <Setter Property="Control.FontFamily" Value="Times New Roman"/> <Setter Property="Control.FontSize" Value="18"/> <Setter Property="Control.FontWeight" Value="Bold"/> </Style> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <Button Style="{StaticResource BigFontButtonStyle}"> </Button> </Grid>通过样式系统不仅可以创建多组明显相关的属性设置,而且使得应用程序这些设置更加容易,从而精简了标记。
<Setter Property="Control.Background"> <Setter.Value> <ImageBrush TileMode="Tile" ViewboxUnits="Absolute" Viewport="0 0 32 32" ImageSource="" Opacity="0.3"></ImageBrush> </Setter.Value> </Setter>
<Style x:Key="BigFontButtonStyle" TargetType="Button"> <Setter Property="FontFamily" Value="Times New Roman"/> <Setter Property="FontSize" Value="18"/> <Setter Property="FontWeight" Value="Bold"/> </Style>
<Window.Resources> <Style x:Key="MouseOverHighlightStyle"> <EventSetter Event="TextBlock.MouseEnter" Handler="element_MouseEnter"></EventSetter> <EventSetter Event="TextBlock.MouseLeave" Handler="element_MouseLeave"></EventSetter> </Style> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <TextBlock Style="{StaticResource MouseOverHighlightStyle}"></TextBlock> </Grid>
<Window.Resources> <Style x:Key="BigFontButtonStyle"> <Setter Property="Control.FontFamily" Value="Times New Roman"/> <Setter Property="Control.FontSize" Value="18"/> <Setter Property="Control.FontWeight" Value="Bold"/> </Style> <Style x:Key="NewBigButtonBigFontStyle" BasedOn="{StaticResource BigFontButtonStyle}"> <Setter Property="Control.Foreground" Value="Red"/> <Setter Property="Control.Background" Value="DarkBlue"/> </Style> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <TextBlock Style="{StaticResource NewBigButtonBigFontStyle}">test</TextBlock> </Grid>
<Window.Resources> <Style TargetType="Button"> <Setter Property="Control.FontFamily" Value="Times New Roman"/> <Setter Property="Control.FontSize" Value="18"/> <Setter Property="Control.FontWeight" Value="Bold"/> </Style> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <Button>one</Button> <Button Style="{x:Null}">two</Button> <Button>three</Button> </Grid>上面的例子中第二个按钮显示替换了样式,将style设置为null,有效的删除了样式。
| 名称 | 说明 |
| Trigger | 这是一种最简单的触发器。可以监测依赖项属性的变化,然后设置器改变样式。 |
| MultiTrigger | 与Trigger类似,但这种触发器联合了多个条件。只有满足了所有这些条件,才会启动触发器。 |
| DataTrigger | 这种触发器使用数据绑定,与Trigger类似,只不过监视的是任意绑定数据的变化。 |
| MultiDataTrigger | 联合多个数据触发器。 |
| EventTrigger | 这是最复杂的触发器。当事件发生时,这种触发器应用动画。 |
<Window.Resources> <Style x:Key="BigFontButton"> <Style.Setters> <Setter Property="Control.FontFamily" Value="Times New Roman"/> <Setter Property="Control.FontSize" Value="18"/> <Setter Property="Control.FontWeight" Value="Bold"/> </Style.Setters> <Style.Triggers> <Trigger Property="Control.IsFocused" Value="True"> <Setter Property="Control.Foreground" Value="DarkRed"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>触发器的优点是不需要为翻转他们而编写任何代码。 如果希望几个条件都满足时才激活触发器,可使用MultiTrigger
<Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Property="Control.IsFocused" Value="true"/> <Condition Property="Control.IsMouseOver" Value="true"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="Control.Foreground" Value="DarkRed"/> </MultiDataTrigger.Setters> </MultiDataTrigger> </Style.Triggers>
<Window.Resources> <Style x:Key="BigFontButton"> <Style.Setters> <Setter Property="Control.FontFamily" Value="Times New Roman"/> <Setter Property="Control.FontSize" Value="18"/> <Setter Property="Control.FontWeight" Value="Bold"/> </Style.Setters> <Style.Triggers> <EventTrigger RoutedEvent="Mouse.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Duration="0:0:3" Storyboard.TargetProperty="FontSize" To="50"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="Mouse.MouseLeave"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Duration="0:0:3" Storyboard.TargetProperty="FontSize"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid Name="gird1" ShowGridLines="True"> <Button HorizontalAlignment="Center" VerticalAlignment="Center" Style="{StaticResource BigFontButton}">onesfsfsfsfsdfsdf</Button> </Grid>
与属性触发器不同如果希望元素返回原始状态,需要反转事件触发器。如上面例子,需要编写MouseLeav事件的触发器。不需要指明字体的大小,默认会恢复成第一次动画之前的字体大小。