笔者在使用的WPF过程中,见过的触发器有三种:Trigger、DataTrigger、EventTrigger。其中最为常用的要属Trigger。至于触发器的作用就是当某个属性的值发生变化,应该去做某事。当然这是笔者自身的理解。比较简单。那么这三者之间有什么不同呢?这便是这章要讨论的目地。WPF的Style笔者喜欢把他看作CSS的样式。那么Trigger触发器你们可以理解为CSS样式中类似于:hover 伪类。这样子笔者做一个列子吧。如下,当鼠标移动在文本上面的,前景色变成为红色。

<Grid>
<TextBlock Text="I am Aomi" Width="75" Height="20">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>

执行结果

鼠标移在上面

相信从上面的例子你至少可以明白触发器的作用。而且作用还不小呢?好了。这一点笔者就不需要在重复的去讲解了。那么DataTrigger又跟Trigger有什么区别呢?可以说作用上来讲没有什么区别,但是在面向对象却是不一样子的。Trigger都是专对于控件自身的依赖属性(dependency properties)。DataTrigger是一般专对于另的控件的属性,而且都是用绑定来实现的。如下面的例子。

    <Grid>
<TextBlock Text="I am Aomi" Width="75" Height="20">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>

那么例子的效果跟上一例子一样子。代码上面也没有多大的差别。主要是修改了触发器的写法而以。但是我们要认识到一点:Trigger一般都是跟属性直接关联。而DataTrigger是通过绑定来关联。所以DataTrigger一般用于写另一个控件上的属性在当前控件的触发效果。当然也可以绑定自身,如上。那么在举一个绑定另一个控件的属性吧。如下

<StackPanel Orientation="Vertical">
<ToggleButton Name="Changer" Content="变红" Width="75" Height="30"></ToggleButton>
<TextBlock Text="I am Aomi" Width="75" Height="20">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName= Changer}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>

执行结果:

最后一个Eventtrigger一般用于动画效果的处理。上面俩个触发器作用对象都是属性。而这个却是作用于事件的。表示当前某个事件发生后要触发。笔者自己写例子太麻烦了。就到国外复制一个例子过来说明。如下

    <StackPanel Orientation="Vertical">
<TextBlock Text="I am Aomi" HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.300" Storyboard.TargetProperty="FontSize" To="28" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.800" Storyboard.TargetProperty="FontSize" To="18" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>

例子的功能很简单就是当鼠标进入到文字区域的时候文字变大到28字体。如果离开就变成18字体。

执行效果:

上面的触发器应该来讲算是比较简单而又常用。可是都是单个触发条件。我们在编写业务代码的时候,往往可以存在多个条件下的触发效果。所以上面的Trigger和DataTrigger就不能满足需求了。为了这种情况,WPF为Trigger提供了MultiTrigger,为DataTrigger提供了MultiDataTrigger。除了语法上有一定的区别以外,效果是一样子的。如下

 <TextBlock Text="I am Aomi" Width="75" Height="20">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsEnabled" Value="True" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#4d4d4d" />
</MultiTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>

从上面我们可以看到Condition就是多条件。用法用单条件是一样子的。

执行效果:

最后让我们看一下MultiDataTrigger的用法吧。如下

<TextBlock Text="I am Aomi" Width="75" Height="20">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsChecked,ElementName=Changer }" Value="True" />
<Condition Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self} }" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Red" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>

执行效果:

WPF 杂谈——Trigger触发器的更多相关文章

  1. wpf中的触发器详解

    原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会 ...

  2. wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)

    2010-03-24 16:19:07|  分类: WPF相关 |  标签: |字号大中小 订阅     wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2  简单 ...

  3. WPF样式与触发器(3)

    WPF中的各类控件元素, 都可以自由的设置其样式. 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Mar ...

  4. WPF 杂谈——开篇简言。

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...

  5. 如何在 UWP 使用 wpf 的 Trigger

    本文需要告诉大家,如何使用 Behaviors 做出 WPF 的 Trigger ,需要知道 UWP 不支持 WPF 的 Trigger . 安装 Behaviors 请使用 Nuget 安装,可以输 ...

  6. WPF 杂谈——开篇简言

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...

  7. WPF 样式(定义样式、引用样式、样式作用域、Trigger触发器)

    1.定义 资源字典   <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presenta ...

  8. WPF中的触发器简单总结

    原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html 触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一 ...

  9. WPF 基础 - Trigger

    1. Trigger 1.1 由属性值触发的 Trigger 最基本的触发器,Property 是关注的属性名称,value 是触发条件,一旦触发条件满足,就会应用 Trigger 的 Setters ...

随机推荐

  1. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  2. 如何显示mnist中的数据(tensroflow)

      在使用mnist数据集的时候,一直想看看数据中原来的图片,还有卷积层.池化层中的图片,经过不断的捣鼓,最后终于显示了出来.只看数据集中的图片用如下代码就好了: import tensorflow. ...

  3. (继承)virtual与访问控制

    之前只注意过访问控制与继承的关系,这边不多说,今天看到代码看到virtual放在private里,并且还有派生类没有override public里的virtual,此时调用时啥情况了,这边有点晕,看 ...

  4. SSM框架中常用的注解

    @Controller:在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model , ...

  5. 【JAVAWEB学习笔记】28_jqueryAjax:json数据结构、jquery的ajax操作和表单校验插件

    Ajax-jqueryAjax 今天内容: 1.json数据结构(重点) 2.jquery的ajax操作(重点) 3.jquery的插件使用   一.json数据结构 1.什么是json JSON(J ...

  6. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  7. Hibernate与Jpa的关系(1)

    [转自:http://freewind.me/blog/20111129/588.html ] 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseL ...

  8. 《HelloGitHub》第 14 期

    公告 欢迎通过在 GitHub 上新建 issues 方式推荐项目,我真心希望读者可以在 HelloGItHub,找到真正的编程乐趣! <HelloGitHub>第 14 期 兴趣是最好的 ...

  9. JS 正则表达式否定匹配(正向前瞻)

    引言:JS 正则表达式是 JS 学习过程中的一大难点,繁杂的匹配模式足以让人头大,不过其复杂性和其学习难度也赋予了它强大的功能.文章从 JS 正则表达式的正向前瞻说起,实现否定匹配的案例.本文适合有一 ...

  10. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...