WPF中的触发器简单总结

原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html

触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一个或多个条件执行Setter中的属性改变。因为复用的缘故,Styles是放置触发器的最好位置。但对于每个FrameworkElement来说都有Triggers集合,你也可以放在Triggers集合里。触发器有三种类型:

  属性触发器Property Trigger:当Dependency Property的值发生改变时触发。
  数据触发器Data Trigger:当普通.NET属性的值发生改变时触发。
  事件触发器Event Trigger:当路由时间被触发时调用

1.      属性触发器(Property Trigger)
属性触发器是WPF中最常用的触发器类型,因为我们前边说过依赖属性具有垂直变更通知的功能,所以在使用属性触发器时会很方便,而且因为WPF中每个控件超过2/3的属性都是依赖属性,所以它用到的场合更多。属性触发器是在当某个依赖属性的值发生变化时触发执行一个Setter的集合,当属性失去这个值时,这些被触发执行的Setter集合会自动被撤销
例如:注意,属性触发器是用Trigger标识的
        <Trigger Property="IsMouseOver" Value="true">
              <Setter Property="Cursor" Value="Hand" />
        </Trigger>
        <Trigger Property="IsSelected" Value="true">
              <Setter TargetName="brdbutton"
                      Property="Background"
                      Value="{StaticResource TabRedBrush}" />
         </Trigger>
属性触发器还经常被用在做数据验证时用来显示验证错误信息。在WPF学习之绑定里的Validation部分我们附有用属性触发器来判断是否有验证错误并显示相应验证错误信息的示例
<TextBox Style="{StaticResource validateTextBoxStyle}">
   <TextBox.Text>
       <Binding UpdateSourceTrigger="PropertyChanged" Path="Department">
           <Binding.ValidationRules>
              <local:JpgValidationRule/>
         </Binding.ValidationRules>
       </Binding>
  </TextBox.Text>
</TextBox>
<Style x:Key="validateTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Width" Value="300" />
    <Style.Triggers>
       <Trigger Property="Validation.HasError" Value="True">
         <Setter Property="Background" Value="Red"/>
               <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
      </Trigger>
    </Style.Triggers>
</Style>

2.      数据触发器Data Trigger
数据触发器和属性触发器除了面对的对象类型不一样外完全相同。数据触发器是来检测非依赖属性------也就是用户自定义的.NET属性-----的值发生变化时来触发并调用符合条件的一系列Setter集合。
例如:
  <DataTrigger Binding="{Binding Path=Class}"
               Value="1">
                <Setter Property="Background"
                        Value="{StaticResource ExpanderBackgroundOneBrush}" />
                <Setter Property="Background"
                        TargetName="tgbHeader"
                        Value="{StaticResource ExpanderToggleBorderBackgroundOneBrush}" />
  </DataTrigger>
3.      事件触发器 Event Trigger
事件触发器,顾名思义是在某个事件被触发时来调用这个触发器的相关操作。因为WPF提供了用XAML来标记对象,事件等,所以其提供了一些在普通.NET开发中看似没用的属性例如IsMouseOver, IsPressed等,这是为了XAML来用的,使其可以很方便的通过某个属性来判断状态,也方便了Property Trigger的应用。而作为事件触发器来说,它所做的事情和Property Trigger类似,不过是它的内部不能是简单的Setter集合,而必须是TriggerAction的实例。
例如:
  <EventTrigger RoutedEvent="Mouse.MouseEnter"
                SourceName="grdNormalButton">
                <BeginStoryboard Storyboard="{StaticResource NormalButton_MouseEnter}" />
   </EventTrigger>
4.      MultiDataTrigger & MultiTrigger
截至目前我们讨论的都是针对单个条件的触发器,也就是说当某一个条件满足时就会触发。而现实中我们可能需要满足很多个条件时才触发一系列操作,这个时候就需要用到MultiDataTrigger或MultiTrigger。MutliDataTrigger和MultiTrigger都具有一个Conditions集合用来存放一些触发条件,这里的Condition之间是and的关系,当所有条件都满足时,Setter集合才会被调用。根据名字就可以看清楚:MultiDataTrigger用来实现多个数据触发器(只用于普通.NET属性)满足条件时调用;MultiTrigger用来实现多个属性触发器(用于依赖属性)满足条件时调用
例如:
<MultiTrigger>
       <MultiTrigger.Conditions>
            <Condition Property="Visibility " Value="Visible" />
            <Condition Property="IsEnabled" Value="true" />
       </MultiTrigger.Conditions>
       <Setter Property="BorderBrush" Value="Red"/>
       <Setter Property="FontSize" Value="14" />
       <Setter Property="FontWeight" Value="Bold" />
       <Setter Property="Foreground" Value="Red" />
</MultiTrigger>
同样的,你也可以用MultiDataTrigger来对自定义的属性进行多条件的与关系操作

 

时间: 2024-12-03 21:34:44

WPF中的触发器简单总结的相关文章

wpf中的触发器详解

原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会涉及触发器的使用.顾名思义,触发器(Trigger)就是当某种条件满足后即完成相应逻辑功能的一部分程序组成.在当前的WPF中,Trigger一共有三种类型,它们分别是: (1)属性触发器:其对应的类是Trigger.它在特定关联属性发生变化时被触发. (2)数据触发器:其对应的类是DataTrigg

Mysql中的触发器简单介绍及使用案例_Mysql

什么是触发器? 触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句 触发器的语法结构: create trigger 触发器的名称触发器事件 on 监听的表名 for each row 行为发生后执行的sql语句 触发器事件组成::两部分组成: 触发器事件发生的时间-----是在监听的表的行为 after before 常用的是after 触发器执行的内容:增删改 创建order 表的时候,需要注意,因为order在mysql中是一个关

管理-在选课信息表中建立选课触发器 简单些 用if else 明天就要交了急急急!!!

问题描述 在选课信息表中建立选课触发器 简单些 用if else 明天就要交了急急急!!! 建立学生信息表 create table student ( Stu_No BIGINT(80) PRIMARY KEY, Stu_Name VARCHAR(25) NOT NULL, Stu_Sex VARCHAR(2) NOT NULL, College VARCHAR(40) NOT NULL, Profession VARCHAR(40) NOT NULL, Class INT(10) NOT N

在WinForm和WPF中使用GMap.Net地图插件简单教程_实用技巧

如何在WinForm中使用GMap.Net 项目主页:https://greatmaps.codeplex.com/ 下载GMap.Net,我下载的版本:greatmaps_81b71bf30091,编译三个核心项目: GMap.Net.Core:核心DLL GMap.Net.WindowsForms:WinForm中使用的DLL GMap.NET.WindowsPresentation:WPF中使用的DLL 在WinForm项目中使用GMap: 1.新建一个Visual C# 的Windows

WPF中的Style(风格,样式)

在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作为一种资源被保存下来的. 看下面的例子: <Window.Resources>        <Style TargetType="Button">       <Setter Property="Fore

WPF 中 ICollectionView 及 ItemsControl 相关的重点

为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享.   ICollectionView 接口的简易使用方法   它的 SortDescriptions.GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新. 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合). 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新.

WPF中的MatrixTransform

虽然在WPF中可以使用TranslateTransform.RotateTransform.ScaleTransform等进行几何变换,但我们也可以使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换. 首先我们矩阵如何影响几何变换的: 1,缩放操作 观察下面的矩阵乘法 如果我们用[2 5]代表点(2,5),我们发现其乘以一个矩阵后变成了[4,5],与之对应的点是(4,5),这相当与其X坐标变成了原来的两倍. 同理: 经过矩阵乘法后点(2,5)的Y坐标变成了原来的两倍(2

基础: WPF中的三维文字

诸如 TrueType 之类的矢量字技术主要供我们灵活准确排版之用,但它们也可以充当图形处理的对象.程序员可以访问定义每个文本字符的实际轮廓,并将它们视为矢量图形对象.这些轮廓可以进行笔划书写.填充.用于剪辑或进行转换.Microsoft Word 中的常见"艺术字"功能便是以此概念为基础. 认识到这些字符轮廓的特性和局限性非常重要:它们是完全几何性的,缺少操作系统通常在屏幕上呈现字体时所用的"提示".通过这些提示可以依据可用的像素网格智能地对字符进行光栅化处理.因

WPF中实现PropertyGrid的三种方式

由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章 介绍在WPF中实现PropertyGrid的三种方式,三种方式都是俺平时使用时总结出 来的. 第一种方式:使用WindowsForm的PropertyGrid控件. 用过WPF的童鞋都晓得,可以通过WindowsFormsHost将WindowsForm的控件宿 主到WPF中使用.很简单,分为简单的3步. 第一步:引用dll:在WPF应用程序中引入System.Windows.Forms.dll. 第二步:引用命