尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

WPF 控制动画开关

WPF 控制动画开关
📅 发布时间:2026/7/29 18:26:21

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

第一步:

首先定义一个静态类,提供依赖属性,进而方便在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">

相关新闻

  • 小程序自助搭建平台有哪些:2026零代码新手工具合集 - 维双云小凡
  • Umi-OCR:完全免费开源的离线OCR软件,让文字识别变得如此简单!
  • 【Zabbix】开源分布式监控系统---Zabbix 6.4.8 源码包安装与配置

最新新闻

  • 2026 年更新:榆林口碑好的高纯活性氧化钙制造厂家深度剖析,别再花冤枉钱了,这玩意儿才是工业脱硫脱酸的核心黑马,你真的选对了吗?-宝达钙业 - 企业推荐官【认证】
  • LLM 时代的前端工程师核心竞争力重塑:从写代码到驾驭 AI 的转型路线
  • LayaAir引擎:3D游戏开发的终极跨平台解决方案
  • Edge-TTS深度解析:如何通过Python免费调用微软高质量语音合成服务
  • HouseMD部署指南:3步完成生产环境配置,安全高效监控线上应用
  • 2026吉他新手避坑攻略|3大核心要点+套路拆解,小白直接抄作业

日新闻

  • 金融舆情监测系统:多语言情感分析与实时可视化技术解析
  • QT C++调用Python异常处理:PyBind11实战与跨语言编程指南
  • A-47双麦回音消除模块:主次麦空间分布与差分连接对ENC性能的影响

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号