WPF触发器

Posted 挨踢老干部的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 

可使用所有触发器

以上是关于WPF触发器的主要内容,如果未能解决你的问题,请参考以下文章

WPF代码触发Button点击事件

WPF学习第三十七章 触发器

WPF – 使用触发器

WPF 精修篇 属性触发器

Wpf 绑定 + 数据触发器

dotnet 读 WPF 源代码笔记 渲染收集是如何触发