样式触发器不想Setter一开始就使用定义好的样式。Style类提供了Triggers集合,每个样式可以有多个触发器,每个触发器是一个派生自System.Windows.TriggerBase类的实例。在WPF中,派生自TriggerBase的触发器有如下几种类型。
- Trigger:最简单的触发器,该触发器检查特定的依赖属性的值是否发生变化来使用Setter改变样式。
- MultiTrigger:组合了多个条件,所有的条件必须被满足才能改变。
- DataTrigger:该触发器与数据绑定在一起运行。但是该触发器是检测任何绑定的数据是否发生变化。
- MultiDataTrigger:组合了多个dataTrigger。
- EventTrigger:最常用的触发器,当某个事件触发时改变样式。
创建简单触发器
它监测依赖属性的改变而改变样式。例下:通过检测鼠标是否位于指定的按钮上来触发样式的变更。
<Window.Resources>
<Style.Triggers>
<Trigger Property="Control.IsMouseOver" Value="true">
<!-- 当鼠标移过按钮时,触发样式变更-->
<Setter Property="Control.FontStyle" Value="Italic"/>
<Setter Property="Control.Background" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button Content="Button1" HorizontalAlignment="Left" Margin="231,179,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}"/>
<Button Content="Button2" HorizontalAlignment="Left" Margin="231,240,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}"/>
</Grid>
也可以在一个样式中使用多个触发器应用到同一个元素。
<Window.Resources>
<Style x:Key="MouseIsOver">
<!-- 定义基本样式 -->
<Setter Property="Control.FontSize" Value="11"></Setter>
<Setter Property="Control.Margin" Value="11"></Setter>
<!-- 定义简单触发器 -->
<Style.Triggers>
<Trigger Property="Control.IsMouseOver" Value="true">
<!-- 当鼠标移过按钮时,触发样式变更-->
<Setter Property="Control.FontStyle" Value="Italic"/>
<Setter Property="Control.Background" Value="Blue"/>
</Trigger>
<!-- 当按钮按下时,变更按钮的颜色和字体 -->
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property="Control.FontStyle" Value="Normal"/>
<Setter Property="Control.Background" Value="Yellow"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
如果多个触发器修改相同的属性,则最后触发的触发器具有优先权。
控件模板
WPF提出了控件模板的特性,使开发人员可以完全重新定义控件的外观。在WPF中,每个控件都有一个默认的控件模板,用于定义控件的基本外观和行为。WPF使用ControlTemplate定义控件的外观,每个控件都有一个Template属性。分为以下3类:
ControlTemplate,有2个属性TargetType用来指定模板的控件类型,Trigger则指定模板的触发器集合。
DataTemplate
ItemsPanelTemplate
创建控件模板的目地基本是为了重用,所以一般定义到资源中,然后使用StaticResource进行引用。
例如:
<Window.Resources>
<Style x:Key="MouseIsOver">
<!-- 定义基本样式 -->
<Setter Property="Control.FontSize" Value="11"></Setter>
<Setter Property="Control.Margin" Value="11"></Setter>
<!-- 定义简单触发器 -->
<Style.Triggers>
<Trigger Property="Control.IsMouseOver" Value="true">
<!-- 当鼠标移过按钮时,触发样式变更-->
<Setter Property="Control.FontStyle" Value="Italic"/>
<Setter Property="Control.Background" Value="Blue"/>
</Trigger>
<!-- 当按钮按下时,变更按钮的颜色和字体 -->
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property="Control.FontStyle" Value="Normal"/>
<Setter Property="Control.Background" Value="Yellow"/>
</Trigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2" Background="Red" TextBlock.Foreground="White" Margin="2">
<!-- 使用ContentPresenter指定内容属性 -->
<ContentPresenter RecognizesAccessKey="True" HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Border>
</ControlTemplate>
</Window.Resources>
<Button Content="Button1" HorizontalAlignment="Left" Margin="231,179,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource MouseIsOver}" Template="{StaticResource ButtonTemplate}"/>
效果:
模板触发器
上述代码中有模板触发器的效果