在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同时使用的问题了。
希望对大家有所帮助!
目录
相关文章
|
C# 前端开发
WPF DatePicker默认显示当前日期,格式化为年月日
原文:WPF DatePicker默认显示当前日期 WPF的日历选择控件默认为当前日期,共有两种方法,一种静态,一种动态。 静态的当然写在DatePicker控件的属性里了,动态的写在对应的cs文件里,具体请看下面。
6775 0
|
自然语言处理 搜索推荐 程序员
因为看不惯Notepad++,国内大佬开源了Notepad--:技术分享与工作学习中的新选择
【8月更文挑战第20天】在编程界,文本编辑器是每一位开发者日常工作中不可或缺的工具。Notepad++,这款曾经风靡一时的文本编辑器,以其强大的功能和简洁的界面赢得了众多程序员的喜爱。然而,近年来,由于其作者的一些不当言论和行为,引发了广泛争议,许多程序员开始寻找替代品。在这样的背景下,国内一位大佬挺身而出,开源了Notepad--,为开发者们带来了一个新的选择。
1016 1
|
11月前
|
C# Windows
C#实现指南:将文件夹与exe合并为一个exe
C#实现指南:将文件夹与exe合并为一个exe
674 9
|
存储 开发工具 数据安全/隐私保护
Git 与 SVN:版本控制领域的双星对比
【8月更文挑战第27天】
508 6
|
XML 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
860 0
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
607 0
|
机器人 C# 人工智能
智能升级:WPF与人工智能的跨界合作——手把手教你集成聊天机器人,打造互动新体验与个性化服务
【8月更文挑战第31天】聊天机器人已成为现代应用的重要组成部分,提供即时响应、个性化服务及全天候支持。随着AI技术的发展,聊天机器人的功能日益强大,不仅能进行简单问答,还能实现复杂对话管理和情感分析。本文通过具体案例分析,展示了如何在WPF应用中集成聊天机器人,并通过示例代码详细说明其实现过程。使用Microsoft的Bot Framework可以轻松创建并配置聊天机器人,增强应用互动性和用户体验。首先,需在Bot Framework门户中创建机器人项目并编写逻辑。然后,在WPF应用中添加聊天界面,实现与机器人的交互。
464 0
|
前端开发 C#
WPF技术之ContentControl 控件
ContentControl 是 WPF 中的一个常见控件,用于显示单个内容元素。它可以包含任意类型的内容,包括文本、图像、控件等。
2185 0
|
Ubuntu 测试技术 Linux
warp工具
本文档介绍了在Ubuntu 20.04上使用Cloudflare Warp代理网络以解决访问限制问题。
548 0