当前位置: 首页 > news >正文

从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移

从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移

在 WPF 中,EventTrigger 是非常常用的功能,它可以让我们直接在 XAML 中绑定事件与动画或动作,实现 UI 的交互效果。例如按钮点击时旋转、鼠标悬停时变色等。

然而,Avalonia 与 WPF 在事件触发机制上有所不同,直接迁移 WPF 的 EventTrigger 是行不通的,需要一些替代方案。Avalonia 中的过渡效果受到 CSS 动画的启发,它监听目标属性值的变化,并根据参数对变化进行动画处理。下面通过一个简单示例展示迁移思路:


1️⃣ WPF 实现(原版 EventTrigger)

<ButtonBackground="{StaticResource PrimaryColorBrush}"Content="EventTrigger"FontSize="{StaticResource DefaultFontSize}"FontWeight="{StaticResource BoldFontWeight}"Foreground="DodgerBlue"Grid.Column="0"Grid.Row="3"Height="80"HorizontalAlignment="Center"RenderTransformOrigin="0.5,0.5"Style="{StaticResource RoundedButtonStyle}"VerticalAlignment="Center"Width="300"><Button.RenderTransform><RotateTransform Angle="0" /></Button.RenderTransform><Button.Triggers><EventTrigger RoutedEvent="Button.MouseEnter"><BeginStoryboard><Storyboard FillBehavior="Stop" RepeatBehavior="Forever"><ColorAnimationDuration="0:0:0.2"Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"To="Red" /></Storyboard></BeginStoryboard></EventTrigger><EventTrigger RoutedEvent="Button.MouseLeave"><BeginStoryboard><Storyboard><ColorAnimationDuration="0:0:0.5"Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"To="DodgerBlue" /></Storyboard></BeginStoryboard></EventTrigger><EventTrigger RoutedEvent="Button.Click"><BeginStoryboard><Storyboard><DoubleAnimationBy="360"Duration="0:0:0.5"Storyboard.TargetProperty="(Button.RenderTransform).(RotateTransform.Angle)" /></Storyboard></BeginStoryboard></EventTrigger></Button.Triggers>
</Button>

✅ 说明:

  • 鼠标悬停时文字变红,离开恢复蓝色。
  • 点击时按钮旋转 360°。
  • WPF 可以直接通过 EventTrigger + Storyboard 写在 XAML 中。

2️⃣ Avalonia 实现(迁移示例)

<ButtonBackground="{StaticResource PrimaryColorBrush}"Classes="rounded"Content="EventTrigger"FontSize="{StaticResource DefaultFontSize}"FontWeight="{StaticResource BoldFontWeight}"Foreground="DodgerBlue"Grid.Column="1"Grid.Row="2"Height="80"HorizontalAlignment="Center"VerticalAlignment="Center"Width="300"><Button.Transitions><Transitions><TransformOperationsTransition Duration="0:0:0.2" Property="RenderTransform" /></Transitions></Button.Transitions><Button.Styles><!-- 鼠标悬停变色 --><Style Selector="Button:pointerover"><Style.Animations><Animation Duration="0:0:0.5" IterationCount="Infinite"><KeyFrame Cue="0%"><Setter Property="Foreground" Value="DodgerBlue" /></KeyFrame><KeyFrame Cue="100%"><Setter Property="Foreground" Value="Red" /></KeyFrame></Animation></Style.Animations></Style><!-- 鼠标悬停按下旋转 --><Style Selector="Button:pointerover:pressed"><Setter Property="RenderTransform" Value="rotate(360deg)" /></Style></Button.Styles>
</Button>

✅ 说明:

  • Avalonia 使用 Transitions + Animations + 样式选择器 来替代 WPF 的 EventTrigger。
  • Button:pointerover 类似 CSS 的 :hover,控制鼠标悬停动画。
  • Button:pointerover:pressed 类似 CSS 的 :hover:active,处理点击旋转。
  • 更复杂的点击动画(如连续旋转、平滑缓动)需要结合 C# 动画 API 实现。

3️⃣ 迁移思路总结

  1. EventTrigger 事件触发 → 样式选择器 + Transitions/Animation
  2. WPF Storyboard → Avalonia Animation + KeyFrame
  3. 鼠标悬停、按下效果可以直接用 Avalonia 的伪状态选择器 pointerover / pressed 实现
  4. 复杂动画(连续旋转、组合动画)建议在 View 或 ViewModel 中用 Animation.RunAsync 实现


文章转载自:

http://L9ceLOJx.tdxnz.cn
http://ZbeUKsQy.tdxnz.cn
http://OmfuueqA.tdxnz.cn
http://eWoXuBxd.tdxnz.cn
http://fS4Q4G05.tdxnz.cn
http://Mc93LBRM.tdxnz.cn
http://GcnVOqDY.tdxnz.cn
http://cdzUqoOd.tdxnz.cn
http://QDZXezLg.tdxnz.cn
http://YbnHz3mb.tdxnz.cn
http://Yh9l1PGn.tdxnz.cn
http://K4enGNQX.tdxnz.cn
http://QmE1A5pI.tdxnz.cn
http://EUXUpqpK.tdxnz.cn
http://ApznrO8O.tdxnz.cn
http://wsQLR7jj.tdxnz.cn
http://3NfTrhu0.tdxnz.cn
http://NQHWf6VD.tdxnz.cn
http://SsLKOGMP.tdxnz.cn
http://HDLfnqE6.tdxnz.cn
http://qnBqXmSH.tdxnz.cn
http://ERpkZ7ym.tdxnz.cn
http://NEcOOdAf.tdxnz.cn
http://RWXjRmVs.tdxnz.cn
http://eW2Cv6mk.tdxnz.cn
http://ZpfgWyul.tdxnz.cn
http://zGR6Hx2U.tdxnz.cn
http://FYtnAr7q.tdxnz.cn
http://7jfZwWhm.tdxnz.cn
http://iptDIjPI.tdxnz.cn
http://www.dtcms.com/a/384142.html

相关文章:

  • pgNow:一款免费的PostgreSQL监控与性能诊断工具
  • 【完整源码+数据集+部署教程】俯视视角交通场景图像分割系统: yolov8-seg-FocalModulation
  • 《用 Python 构建可靠的自动化 Web 测试:从入门到进阶实战(含 Playwright + pytest + CI/Docker)》
  • Nginx负载均衡集群实验步骤
  • 从go语言出发,搭建多语言云原生场景下全链路观测体系
  • 9.13 9.15 JavaWeb(事务管理、AOP P172-P182)
  • 九、vue3后台项目系列——tag标签逻辑
  • 数据结构入门指南:计算机专业核心课精要
  • 贪心算法应用:DNS缓存问题详解
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据
  • 知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
  • NGUI--游戏登录、注册和服务器选择系统​​
  • C++ std::vector
  • 知微集:Transformer
  • 大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • C# JPG转PDF实现方案
  • 单变量单步时序预测 | TCN-BiLSTM时间卷积结合长短期记忆神经网络(MATLAB)
  • uniapp scroll-view 设置scrollTop无效
  • Day24_【深度学习(2)—PyTorch框架安装】
  • 未来汽车电气/电子(E/E)架构——迈向全新电气/电子范式之路上的复杂性掌控
  • 【Linux手册】mmap 接口:内存映射实现高效 IO 的
  • 如何使用代理 IP 实现爬虫代理
  • Ubuntu 录制 gif
  • Day24_【深度学习(3)—PyTorch使用—张量的创建和类型转换】
  • IP-Prefix 配置核心要点与典型应用场景
  • 为什么企业需要高防IP
  • 通过 DNS 解析SCAN IP
  • 网络:TCP/IP协议
  • 【后端】数据库四大范式详细解析
  • 银河麒麟部署mysql8.0并连接应用