WPF触发器
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 
 
 
  | 
可使用所有触发器 | 
                    
                
                
            
        
浙公网安备 33010602011771号