一、Triggers
触发响应
Triggers
让控件对指定的设置具有响应,如下的3种类型都具有triggers collection
:Style
:设置控件的样式,对应为Style.TriggersControlTemplate
:设置控件的模板(可将其设置在Style
内部),对应为ControlTemplate.TriggersDataTemplate
:数据模板,对应为DataTemplate.Triggers
Triggers
主要作为Style
和ControlTemplate
的一个属性来进行设置,该属性的类型为TriggerCollection
,它是抽象类TriggerBase
的一个集合。Triggers
共有5种触发类型,如下图所示:
二、以Style.Triggers
触发类型为例,其它两种类似
- Trigger类型
Property
只能为属性值,不能为事件Value
设置具体的值Setter
当满足该属性值时触发项内容
<Style x:Key="BtnStyle01" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="FontStyle" Value="Italic"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
- MultiTrigger类型
Conditions
:为设置的条件属性,在此为满足设置的多个条件就可以触发对应的设置。- 当
Button
的字体和字形都满足条件时,字体就会变成红色
<Style x:Key="BtnStyle02" TargetType="Button">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="FontSize" Value="20"/>
<Condition Property="FontFamily" Value="Times New Roman"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Red"/>
</MultiTrigger>
</Style.Triggers>
</Style>
- EventTrigger类型
RoutedEvent
为主要的属性,用来设置触发的具体事件,其值只能为事件类型Actions
为接下来为具体的响应事件,一般为动画
<Style x:Key="BtnStyle03" TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="FontSize" From="10" To="40"
Duration="0:0:2" RepeatBehavior="3x" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.2"
Duration="0:0:2" AutoReverse="True" RepeatBehavior="3x" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
- DataTrigger类型和MultiDataTrigger类型
- 当绑定的数据满足指定条件时,就会触发一些响应
DataTrigger
和MultiDataTrigger
的区别在于:满足条件的数量,前者只能设置一个条件,而后者可以设置多个条件。- 如下,当
ListBox
绑定的数据中某些属性满足指定的值时,就会以不同的颜色或背景来进行显示:
using System.Collections.ObjectModel;
//自定义绑定的数据类型
namespace Pr24_Style.SubItem
{
public class MyData
{
public string CityName { set; get; }
public string CurState { set; get; }
public MyData(string str1, string str2)
{
CityName = str1;
CurState = str2;
}
}
public class PlacesData : ObservableCollection<MyData>
{
public PlacesData()
{
Add(new MyData("BeiJing", "On"));
Add(new MyData("ShangHai", "Off"));
Add(new MyData("GuangZhou", "No"));
Add(new MyData("HangZhou", "On"));
Add(new MyData("NanJin", "To"));
Add(new MyData("Shenzhen", "On"));
}
}
}
<!--资源文件-->
<local:PlacesData x:Key="placesData"/>
<Style x:Key="lsty" TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=CurState}" Value="On"> <!--当CurState值为On时,会触发响应-->
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=CityName}" Value="ShangHai"/>
<Condition Binding="{Binding Path=CurState}" Value="Off"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="Violet"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
<!--设置数据显示的样式-->
<DataTemplate DataType="{x:Type local:MyData}">
<Canvas Width="160" Height="20">
<TextBlock Canvas.Left="0" Width="130" FontSize="12" Text="{Binding Path=CityName}"/>
<TextBlock Canvas.Left="130" Width="30" FontSize="12" Text="{Binding Path=CurState}"/>
</Canvas>
</DataTemplate>
<!--创建ListBox应用实例,来对资源文件进行调用-->
<ListBox HorizontalAlignment="Center" Width="180" Background="Honeydew"
ItemsSource="{Binding Source={StaticResource placesData}}" ItemContainerStyle="{StaticResource lsty}"/>
结果如下: