在Style中将EventTrigger与Trigger同时使用

简介: 原文:在Style中将EventTrigger与Trigger同时使用 现在在看WPF关于Trigger的有关实例,然后找到一篇不错的文章,特此转载,收藏一下!!   一般情况下,使用Style时,可以对ControlTemplate添加Triggers,既可以添加EventTrigger,又可以Trigger。
原文: 在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同时使用的问题了。
希望对大家有所帮助!
目录
相关文章
Element el-color-picker 颜色选择器详解
本文目录 1. 前言 2. 基本用法 3. 带默认值 4. 调整尺寸 5. 小结
1918 0
Element el-color-picker 颜色选择器详解
|
1月前
element-plus table表格cell-style的使用
element-plus table表格cell-style的使用
27 1
【已解决】Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>
Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>
297 0
【已解决】Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>
|
JavaScript
Element UI - el-table-column 属性之 show-overflow-tooltip 爬坑
Element UI - el-table-column 属性之 show-overflow-tooltip 爬坑
2008 0
|
前端开发
Element UI - el-table 表格 hover 修改背景色
Element UI - el-table 表格 hover 修改背景色
874 0
Element UI - el-table 表格 hover 修改背景色
|
Android开发 数据格式 XML
深入理解Android 自定义attr Style styleable以及其应用
相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程相信大家都比较了解。当然,属性其实也不一定需要和View配合使用,比如我想通过一个Theme中的style对一个库进行一些简单参数的配置,这应该怎么做呢?我今天在封装一个库时
2139 0
|
前端开发 JavaScript API
How to change the background color of button in Footer area
How to change the background color of button in Footer area
105 0
How to change the background color of button in Footer area
手动调用cx-table.focus和a.focus方法的效果比较
手动调用cx-table.focus和a.focus方法的效果比较
100 0
手动调用cx-table.focus和a.focus方法的效果比较
关于div的outline-offset属性和focus事件的接收
关于div的outline-offset属性和focus事件的接收
114 0
关于div的outline-offset属性和focus事件的接收
|
编解码 前端开发 Perl