第一种方案靠代码查找动画资源进行控制第一步首先定义一个静态类提供依赖属性进而方便在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:KeyShadowAnimation DoubleAnimation AutoReverseTrue RepeatBehaviorForever Storyboard.TargetNameShadowEffect Storyboard.TargetPropertyOpacity From0.0 To1 Duration0:0:3 / DoubleAnimation AutoReverseTrue RepeatBehaviorForever Storyboard.TargetNamemyBorder Storyboard.TargetPropertyOpacity From0.3 To1 Duration0:0:3 / !--ThicknessAnimation AutoReverseTrue RepeatBehaviorForever Storyboard.TargetNamemyBorder Storyboard.TargetPropertyMargin From15 To12 Duration0:0:1.5 /-- /Storyboard /Page.Resources其中每一个DoubleAnimation定义中的TargetName是当前界面的其他对象名称Border x:NamemyBorder Grid.ColumnSpan1 Margin4 localVM:AnimationBehavior.IsAnimating{Binding CurrentActionHandle.ExecutionState, Converter{StaticResource SingleFlowExecutionStateToBoolJustRunnimg}} Background{Binding CurrentActionHandle.ExecutionState, Converter{StaticResource SingleFlowExecutionStateToBrushColor}} CornerRadius10 Border.Effect DropShadowEffect x:NameShadowEffect BlurRadius10 Direction12 Opacity80 ShadowDepth0 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.Row1 VerticalAlignmentCenter FontSize26 Text{Binding Message} TextWrappingWrap TextBlock.Style Style TargetTypeTextBlock !-- 默认不闪烁 -- Setter PropertyOpacity Value1 / Style.Triggers !-- 当 IsBlinking 为 true 时启动闪烁动画 -- DataTrigger Binding{Binding IsMessageBlinking} ValueTrue DataTrigger.EnterActions BeginStoryboard Storyboard DoubleAnimation AutoReverseTrue RepeatBehaviorForever Storyboard.TargetPropertyOpacity From1.0 To0.0 Duration0:0:0.5 / /Storyboard /BeginStoryboard /DataTrigger.EnterActions DataTrigger.ExitActions BeginStoryboard Storyboard DoubleAnimation Storyboard.TargetPropertyOpacity To1.0 Duration0:0:0.1 / /Storyboard /BeginStoryboard /DataTrigger.ExitActions /DataTrigger /Style.Triggers /Style /TextBlock.Style /TextBlock然后通过绑定的后端bool变量进行控制。DataTrigger Binding{Binding IsMessageBlinking} ValueTrue