WPF中的触发器,是对WPF事件的一种封装,WPF中的触发器,有多种方式,总结起来可分为:
- 控件触发(FrameworkElement.Triggers集合)
- 样式触发(Styles.Triggers集合)
- 控件模板触发(ControlTemplate.Triggers集合)
- 数据模板触发(DataTemplate.Triggers集合)
每个对应的触发器都是一个集合,上面所有的Triggers都是一个TriggerCollection的泛型集合,其定义基本都是如此:
public TriggerCollection Triggers { get; }
TriggerCollection的定义如下:
public sealed class TriggerCollection : Collection<TriggerBase>
我们查看其继承关系
System.Windows.TriggerBase类
System.Windows.DataTrigger 数据触发器
System.Windows.EventTrigger 事件触发器
System.Windows.MultiDataTrigger 多数据触发器
System.Windows.MultiTrigger 多属性触发器
System.Windows. Trigger 属性触发器
所有的触发器都是TriggerBase的子类,那么TriggerCollection集合在不同的类中,其泛型的子类不同,我们分别对每个触发器做简单介绍
1、属性触发Trigger
顾名思义,属性触发器是由属性的改变而引起的,所以属性触发器有几个关键属性:
Property:获取或设置返回的值进行比较的属性 Value 触发器的属性。 比较是引用相等性检查。(只有依赖属性才有用)
Value:获取或设置要与该元素的属性值进行比较的值。 比较是引用相等性检查
Setter:获取一套 Setter 对象,描述要应用当满足指定的条件的属性值。
Setter: 属性是一个SetterBaseCollection 的集合,其定义如下:
public SetterBaseCollection Setters { get; }
Setter类:
Property:获取或设置的属性与其 Value 将应用。(只有依赖属性才有用)
Value:获取或设置要应用于指定此属性的值 Setter。
以下代码,指定了属性触发器的使用,由于属性触发一般应用与样式定义中。
<Button Content="触发器" x:Name="btn1" Click="Button_Click" > <Button.Style> <Style> <Setter Property="Button.Width" Value="80"></Setter> <Setter Property="Button.Height" Value="100"></Setter> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="true"> <Trigger.Setters> <Setter Property="Button.Width" Value="200"></Setter> </Trigger.Setters> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>
2、多属性触发器MultiTrigger
多属性触发器,是之一个或者多个样式发生变化时候,才会触发的触发器,其有一个重要属性Condition,用于统计条件,MultiTrigger.Conditions是一个Condition的集合,做一个简单案例,就能说明:
<Style> <Setter Property="Button.Width" Value="80"></Setter> <Setter Property="Button.Height" Value="100"></Setter> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Control.IsFocused" Value="true"></Condition> <Condition Property="Control.IsMouseOver" Value="true"></Condition> </MultiTrigger.Conditions> <Setter Property="Button.Width" Value="300"></Setter> </MultiTrigger> </Style.Triggers> </Style>
3、事件触发器EventTrigger
事件触发器,是由控件的操作触发的信息,EventTrigger 属性里面,几个关键属性是:
RoutedEvent:获取或设置将激活该触发器的 RoutedEvent。
Actions:获取事件发生时要应用的操作的集合。
主要用于指定路由事件和Actions,那么Actions是什么呢?其定义如下:
public TriggerActionCollection Actions { get; }
它是一个TriggerAction的集合
System.Windows.Interactivity.TriggerAction
Microsoft.Expression.Interactivity.Core.CallMethodAction
Microsoft.Expression.Interactivity.Media.PlaySoundAction
Microsoft.Expression.Interactivity.Media.StoryboardAction
System.Windows.Interactivity.InvokeCommandAction
所以事件触发器,只能调用CallMethodAction,PlaySoundAction,StoryboardAction,InvokeCommandAction,所以事件触发器一般应用与动画中,我们以StoryboardAction为例,我们知道StoryboardAction是Storyboard的一个封装,其主要是封装了动作BeginStoryboard,该动作相当于调用BeginAnimation方法,我们案例如下:
<Button Content="触发器" x:Name="btn1" Click="Button_Click" > <Button.Style> <Style> <Setter Property="Button.Width" Value="80"></Setter> <Setter Property="Button.Height" Value="80"></Setter> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="true"> <Trigger.Setters> <Setter Property="Button.Width" Value="300"></Setter> </Trigger.Setters> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>
4、数据触发DataTrigger
数据触发器,是使用在数据改变的触发,DataTrigger也有两个重要的属性
Binding:获取或设置产生数据对象的属性值的绑定。
Value:获取或设置要与此数据对象的属性值进行比较的值。
案例代码如下:
<Style> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}" Value="8"> <Setter Property="Button.Foreground" Value="Sienna"></Setter> <Setter Property="Button.FontWeight" Value="Bold"></Setter> <Setter Property="Button.FontSize" Value="30"></Setter> </DataTrigger> </Style.Triggers> </Style>
5、多数据触发器MultiDataTrigger
多数据触发器,是对数据触发器的扩展,需要同时满足多个数据改变的情况下才执行。
我们对5种触发器,在4个触发环境中,我进行了简单的分类,虽然有些触发器在有的触发方式中可以使用,但并不代表一定有作用,这个在使用中根据情况进行区分,分类如下:
触发方式 | 可使用的触发器 | 说明 |
控件触发 | 必须使用EventTrigger | 用于调整界面,实现动画等 |
样式触发 | Trigger EventTrigger MultiTrigger DataTrigger MultiDataTrigger | 可使用所有触发器 |
控件模板触发 | Trigger EventTrigger MultiTrigger DataTrigger MultiDataTrigger | 可使用所有触发器 |
数据模板触发 | Trigger EventTrigger MultiTrigger DataTrigger MultiDataTrigger
| 可使用所有触发器 |