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

 

 

 

可使用所有触发器
posted @ 2017-09-01 17:14  Min.Xiaoshuang  阅读(2187)  评论(0编辑  收藏  举报