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

WPF 控制动画开关

第一种方案:靠代码查找动画资源进行控制

第一步:

首先定义一个静态类,提供依赖属性,进而方便在xaml中实现绑定:

public static class AnimationBehavior { // 定义附加属性 public static readonly DependencyProperty IsAnimatingProperty = DependencyProperty.RegisterAttached( "IsAnimating", typeof(bool), typeof(AnimationBehavior), new PropertyMetadata(false, OnIsAnimatingChanged)); public static bool GetIsAnimating(DependencyObject obj) => (bool)obj.GetValue(IsAnimatingProperty); public static void SetIsAnimating(DependencyObject obj, bool value) => obj.SetValue(IsAnimatingProperty, value); private static void OnIsAnimatingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is FrameworkElement element) { // 通过 VisualTreeHelper 查找模板中的 Storyboard if (element.FindResource("ShadowAnimation") is Storyboard storyboard) { if ((bool)e.NewValue) storyboard.Begin(element, true); // 启动动画 else storyboard.Stop(element); // 停止动画 } } } }

其中实现了依赖属性IsAnimating。

第二步:

在前端中定义动画:

<Page.Resources> <!-- 将 Storyboard 定义在全局资源中 --> <Storyboard x:Key="ShadowAnimation"> <DoubleAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetName="ShadowEffect" Storyboard.TargetProperty="Opacity" From="0.0" To="1" Duration="0:0:3" /> <DoubleAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetName="myBorder" Storyboard.TargetProperty="Opacity" From="0.3" To="1" Duration="0:0:3" /> <!--<ThicknessAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetName="myBorder" Storyboard.TargetProperty="Margin" From="15" To="12" Duration="0:0:1.5" />--> </Storyboard> </Page.Resources>

其中每一个DoubleAnimation定义中的TargetName是当前界面的其他对象名称:

<Border x:Name="myBorder" Grid.ColumnSpan="1" Margin="4" localVM:AnimationBehavior.IsAnimating="{Binding CurrentActionHandle.ExecutionState, Converter={StaticResource SingleFlowExecutionStateToBoolJustRunnimg}}" Background="{Binding CurrentActionHandle.ExecutionState, Converter={StaticResource SingleFlowExecutionStateToBrushColor}}" CornerRadius="10"> <Border.Effect> <DropShadowEffect x:Name="ShadowEffect" BlurRadius="10" Direction="12" Opacity="80" ShadowDepth="0" Color="{Binding CurrentActionHandle.ExecutionState, Converter={StaticResource SingleFlowExecutionStateToColor}}" /> </Border.Effect> </Border>

比如myBorder 和 ShadowEffect;

第三步:

创建绑定关系:

比如上方代码中:

localVM:AnimationBehavior.IsAnimating="{Binding CurrentActionHandle.ExecutionState, Converter={StaticResource SingleFlowExecutionStateToBoolJustRunnimg}}"

给新手解释一下,其中localVM是自己定义的命名空间:

可我这里使用了转换器,可以理解为就是把执行动画的开关绑定到了我后端ViewModel的属性上。

第二种实现方案,使用 Style + DataTrigger

这种方法比较简单。

写好样式和触发器:

<TextBlock Grid.Row="1" VerticalAlignment="Center" FontSize="26" Text="{Binding Message}" TextWrapping="Wrap"> <TextBlock.Style> <Style TargetType="TextBlock"> <!-- 默认不闪烁 --> <Setter Property="Opacity" Value="1" /> <Style.Triggers> <!-- 当 IsBlinking 为 true 时启动闪烁动画 --> <DataTrigger Binding="{Binding IsMessageBlinking}" Value="True"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:0.5" /> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> <DataTrigger.ExitActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1.0" Duration="0:0:0.1" /> </Storyboard> </BeginStoryboard> </DataTrigger.ExitActions> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock>

然后通过绑定的后端bool变量进行控制。

<DataTrigger Binding="{Binding IsMessageBlinking}" Value="True">
http://www.jsqmd.com/news/1288752/

相关文章:

  • 4K拼接处理器工作原理与关键参数解析:从带载到拼缝 - 无缝混合矩阵厂家
  • 小程序自助搭建平台有哪些:2026零代码新手工具合集 - 维双云小凡
  • 开源工具GBFR-Logs:实现《碧蓝幻想:Relink》精准数据监控的完整解决方案
  • GitHub加速插件终极指南:3分钟让你的下载速度飙升20倍
  • Ollama本地AI助手部署与优化指南
  • Next.js DApp 架构升级策略:从 CSR 到 RSC 的渐进式迁移方案与风险控制
  • 【74HC138设备故障监视电路】2025-5-31
  • OptiScaler终极指南:3步解锁显卡性能,游戏帧率翻倍不是梦!
  • Umi-OCR:完全免费开源的离线OCR软件,让文字识别变得如此简单!
  • 轻量运维工具fastdp
  • 人工耳蜗能用多长时间?植入体可用数十年+10年保修 - 优企甄选
  • 大模型进阶:收藏!小白程序员必备的多智能体架构与LangGraph实战指南
  • 卢森堡的名义雇主公司EOR是什么?
  • 2026湖北省世达实用外国语学校地址招生代码联系电话 - 湖北找学校
  • 【Zabbix】开源分布式监控系统---Zabbix 6.4.8 源码包安装与配置
  • G-Helper:华硕笔记本性能调优的3个核心秘密
  • 逃离塔科夫离线训练器:重塑硬核生存游戏体验的智能引擎
  • 基于BERT的敏捷开发用户故事智能检测插件实践
  • 平台企业用工情况报告制度正在建立,灵活用工平台的数据责任又向前一步
  • openharmony开发资料合集
  • 无惧黑夜、暴雨与洪水:AI视频水文监测如何实现全天候稳定监测
  • HarmonyOS应用开发实战:猫猫大作战-Form Kit 动态卡片
  • AI岗位暴涨12倍,月薪超6万!收藏这份入局指南,抓住大模型时代的人才红利!
  • 爱沙尼亚的人力资源服务在海外市场的应用与发展
  • 【6G】6G,离我们仅有6年
  • 【Zabbix】开源分布式监控系统---Zabbix理论介绍
  • 武汉南华光电职业技术学校招生办联系电话是多少? - 升学择校早知道
  • 125kW SiC双向储能变流器模块技术拆解:三电平拓扑 + SiC功率器件 + 双DSP控制架构详解
  • RAG技术实践:从原理到企业级应用全解析
  • 2026年中山市谜灯照明分体灯杆相关品类推荐 - 起跑123