原文:在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下如何获取每个线程的CPU占用率

    啥也不说,直接上脚本: root@Storage:/mnt/mtd# cat cpu.sh #!/bin/sh while truedo        ps -H -eo user,pid,ppid, ...

  2. 12行Python暴力爬《黑豹》豆瓣短评

    作者:黄嘉锋 来源:https://www.jianshu.com/p/ea0b56e3bd86 草长莺飞,转眼间又到了三月"爬虫月".这时往往不少童鞋写论文苦于数据获取艰难,辗转 ...

  3. [Elm] Functions in Elm

    Functions are an important building block in Elm. In this lesson we will review stateless functions, ...

  4. [Angular] Pluck value from Observable

    export class MailFolderComponent implements OnInit{ title: Observable<string>; messages: Obser ...

  5. Net Reactor 5

    Net Reactor 5脱壳教程   今天别人发来一个.Net的DLL让我脱壳,第一步自然是先扔进de4dot 我这个de4dot 是集成了  Ivancito0z / TheProxy / PC- ...

  6. echarts怎么使用(最最最最简单版)(本质canvas)

    echarts怎么使用(最最最最简单版)(本质canvas) 一.总结 一句话总结:外部扩展插件肯定要写js啊,不然数据怎么进去,不然宽高怎么设置.本质都是canvas嵌套在页面上,比如div中. 1 ...

  7. Oracle数据库零散知识06 -- Package的定义与简单触发器

    CREATE OR REPLACE PACKAGE pak_02 IS--包头 --这里可定义公共参数 FUNCTION fun_01 RETURN NUMBER; PROCEDURE pro_01 ...

  8. 机器学习: TensorFlow 的数据读取与TFRecords 格式

    最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...

  9. .net程序客户端更新方案

    原文:.net程序客户端更新方案 客户端程序一个很大的不便的地方就是程序集更新,本文这里简单的介绍一种通用的客户端更新方案.这个方案依赖程序集的动态加载,具体方案如下: 将程序集存储在一个文件数据库中 ...

  10. Docker for Linux 安装

    原文:Docker for Linux 安装 前言: 环境:centos7.5 64 位 正文: Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想要安装 docker ...