原文:在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. 使用RxPermissions(基于RxJava2)

    使用RxPermissions(基于RxJava2) 0. 背景 Android 6.0 (API level 23)中.将权限分成了两类.一类是Install权限(称之为安装时权限).还有一类是Ru ...

  2. diff_mysql_table_exec.py

    #!/usr/bin/env python #-*- encoding: utf8 -*- import mysql.connector import sys import re import dat ...

  3. php 下载图片到服务器

    function saveImage($path) { if(!preg_match('/\/([^\/]+\.[a-z]{3,4})$/i',$path,$matches)) die('Use im ...

  4. iOS开发ARC与MRC下单例的完整写法与通用宏定义

    #import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _N ...

  5. 【37.21%】【codeforces 721B】Passwords

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 【机器学习实战】第3章 决策树(Decision Tree)

    第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  7. SSL/TLS协议运行机制的概述(转)

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...

  8. js获取浏览器尺寸

    Javascript: alert(document.body.clientWidth);        //网页可见区域宽(body) alert(document.body.clientHeigh ...

  9. Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法

    目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题. 可能需要处理的问题:Session超时.系统500错误.普通的业务错误.权限不足. 同步请求:            Sess ...

  10. 【37%】【poj1436】Horizontally Visible Segments

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5200   Accepted: 1903 Description There ...