原文:在Style中将EventTrigger与Trigger同时使用

现在在看WPF关于Trigger的有关实例,然后找到一篇不错的文章,特此转载,收藏一下!!
 
一般情况下,使用Style时,可以对ControlTemplate添加Triggers,既可以添加EventTrigger,又可以Trigger。
 
但无论如何,在Triggers节点下,是无法同时添加EventTrigger与Trigger复合条件的。拿RadioButton为例,在非选中状态下,MouseEnter与MouseLeave会触发颜色变化事件;在选中状态下,可能又不需要这样的事件。那如何判断MouseEnter与MouseLeave时,到底是选中还是非选中状态呢?
 
以下是非选中状态下的ControlTemplate定义:
 <ControlTemplate
x:Key="UnCheckedImageRadioButtonTemplate"

     
TargetType="{x:Type style:ImageRadioButton}">

  <Grid
x:Name="grdButton">

   <Image
x:Name="PART_OVER_img"

      
HorizontalAlignment="Left"

      
VerticalAlignment="Top"

      
Opacity="0"

      
Source="{Binding Path=ImageOver, Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}"
/>

   <Image
Name="PART_img"

      
HorizontalAlignment="Left"

      
VerticalAlignment="Top"

      
Source="{Binding Path=ImageNormal, Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}"
/>

  </Grid>
  <ControlTemplate.Triggers>

<EventTrigger
RoutedEvent="Mouse.MouseEnter"

       
SourceName="PART_img">

    <BeginStoryboard
Storyboard="{StaticResource stbFadeIn}" />

   </EventTrigger>

<EventTrigger
RoutedEvent="Mouse.MouseLeave"

       
SourceName="PART_img">

    <BeginStoryboard
Storyboard="{StaticResource stbFadeOut}" />

   </EventTrigger>

<EventTrigger
RoutedEvent="Mouse.MouseUp"

       
SourceName="PART_img">

    <BeginStoryboard
Storyboard="{StaticResource stbFadeIn}" />

   </EventTrigger>

<EventTrigger
RoutedEvent="Mouse.MouseDown"

       
SourceName="PART_img">

    <BeginStoryboard
Storyboard="{StaticResource stbFadeOut}" />

   </EventTrigger>

</ControlTemplate.Triggers>

</ControlTemplate>

 
这里,我定义了MouseEnter,MouseLeave,MouseUp和MouseDown事件时触发的Storyboard。但要如何判断这些事件触发时,到底是选中还是非选中呢?我最开始尝试使用MultiTrigger,可MultiTrigger中不能定义EventTrigger,因此不能同时判断MouseEnter事件与选中状态。
 
下面列出了Style的定义,通过Style定义,可以巧妙的将选中属性的判断,定义在ControlTemplate以外。
 
 <Style TargetType="{x:Type
style:ImageRadioButton}">

  <Setter
Property="Focusable"

    Value="False"
/>

  <Setter
Property="Cursor"

    Value="Hand"
/>

  <Style.Triggers>

   <Trigger
Property="IsChecked"

     
Value="True">

    <Setter
Property="Template"

      Value="{StaticResource
CheckedImageRadioButtonTemplate}" />

   </Trigger>

<Trigger
Property="IsChecked"

     
Value="False">

    <Setter
Property="Template"

      Value="{StaticResource
UnCheckedImageRadioButtonTemplate}" />

   </Trigger>

</Style.Triggers>

 </Style>

 
红色字体的部分,就是在Style中,先对选中状态进行的判断,然后ControlTemplate中不需要再同时判断选中状态与MouseEnter事件。然后将先前定义的包含Triggers定义的ControlTemplate简化一下,得到不需要检测EventTrigger的模板。
 
 <ControlTemplate
x:Key="CheckedImageRadioButtonTemplate"

     
TargetType="{x:Type style:ImageRadioButton}">

  <Grid
x:Name="grdButton">

   <Image
x:Name="PART_OVER_img"

      
HorizontalAlignment="Left"

      
VerticalAlignment="Top"

      
Source="{Binding Path=ImageOver, Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}"
/>

  </Grid>

</ControlTemplate>

 
顺利完成!
这样就可以解决EventTrigger与Trigger同时使用的问题了。
希望对大家有所帮助!

在Style中将EventTrigger与Trigger同时使用的更多相关文章

  1. [WPF系列]-基础系列 Property Trigger, DataTrigger & EventTrigger

    So far, we worked with styles by setting a static value for a specific property. However, using trig ...

  2. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  3. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  4. Style样式

    最重要的两个元素 :setter  Trigger  Style中的Setter setter是用来设置属性值的 <Style TargetType="{x:Type TextBox} ...

  5. WPF 杂谈——Trigger触发器

    笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...

  6. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

  7. WPF学习笔记(3)——style

    http://www.cnblogs.com/Zhouyongh/archive/2011/08/01/2123610.html Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可 ...

  8. WPF 基础 - Trigger

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

  9. wpf 中的style

    我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法和数据的载体.控件的算法主要体现在可以激发的事件.可 ...

随机推荐

  1. Linux下多线程查看工具(pstree、ps、pstack),linux命令之-pstree使用说明, linux 查看线程状态。 不指定

    0.最常用 pstree:[root@iZ25dcp92ckZ temp]# pstree -a|grep multe  |       |   `-multepoolser  |       |   ...

  2. 关于stm32的串口电压问题

    在同一块板子的另一个 2号串口,因为没有使用所以就没有配置,,,所以导致这三个引脚都为0; 上面的串口接口封装是围墙座: 注意:倘若要连线,那时候要记得交叉,当然这也要看各自的设计才行

  3. php 小程序获取渠道二维码 保存

    function ppost($url,$arr){ $post_data = json_encode($arr); $url=$url; $ch = curl_init(); curl_setopt ...

  4. 【u118】日志分析

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...

  5. mysql 悲观锁 的运用

    悲观锁: 它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数 ...

  6. 微信开发学习日记(六):weiphp框架

    最近重点在看weiphp这个开源的第三方微信公众平台框架. 在网上找微信资料,找到了这个.很早之前,就初步学习了Thinkphp和Onethink2个开源框架,当看到weiphp是用这2个框架开发的时 ...

  7. BAT实习内推笔试卷(第一场)——个人答案以及分析

    第一题: 给定一个长度不小于2的数组arr. 写一个函数调整arr,使arr中要么全部的偶数位上都是偶数,要么全部的奇数位上都是奇数上. 要求:假设数组长度为N.时间复杂度请达到O(N),额外空间复杂 ...

  8. CoreData使用方法二:NSFetchedResultsController实例操作与解说

    学习了NSFetchedResultsController.才深深的体会到coredata的牛逼之处.原来Apple公司弄个新技术.不是平白无故的去弄,会给代码执行到来非常大的优点.coredata不 ...

  9. PHP移动互联网开发笔记(7)——MySQL数据库基础回顾[1]

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-32 ...

  10. Java8内存模型

    一.JVM内存模型 内存空间(Runtime Data Area)中可以按照是否线程共享分为两块,线程共享的是方法区(Method Area)和堆(Heap),线程独享的是Java虚拟机栈(Java ...