zoukankan      html  css  js  c++  java
  • 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

    可使用所有触发器
  • 相关阅读:
    一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483
    HDU
    UVA-796 Critical Links 找桥
    HDU 4612 Warm up
    2017 ICPC乌鲁木齐 A Coins 概率dp
    HDU6223 Infinite Fraction Path bfs+剪枝
    Java基础知识学习(一)
    算法(一)
    面试题整理:SQL(二)
    面试题整理:SQL(一)
  • 原文地址:https://www.cnblogs.com/minhost/p/7464148.html
Copyright © 2011-2022 走看看