如何通过C#与XAML实现Storyboard动画的启停控制
解决方案
核心原因:定义在触发器内部的Storyboard不属于页面逻辑树元素,不会自动生成后台可访问的字段,因此无法直接获取实例调用控制方法。以下是两种可直接落地的实现方案:
方案一:无需修改现有XAML代码,直接清除目标属性的动画绑定
这种方式不需要改动你已写的XAML逻辑,直接在点击事件中操作RotateTransform的依赖属性即可停止动画,还能让Canvas停在当前旋转角度:
private void stopAnimationClick(object sender, RoutedEventArgs e) { Debug.Print("Stop animation"); // 先拿到当前动画的实时角度 double currentAngle = CanvasRotation.Angle; // 清除Angle属性上绑定的动画,动画会直接失效 CanvasRotation.BeginAnimation(RotateTransform.AngleProperty, null); // 把当前角度赋值回去,让Canvas停在停止时的位置 CanvasRotation.Angle = currentAngle; }
方案二:把Storyboard抽到资源字典中,方便全局控制
如果你后续还需要对动画做启动、暂停、重置等更复杂的控制,建议把动画定义到资源中,方便前后台访问:
- 先修改XAML,把Storyboard抽为StackPanel的资源:
<StackPanel x:Name="stack" DockPanel.Dock ="Top" Orientation="Vertical" Background="#ECE9D8"> <!-- 新增资源定义 --> <StackPanel.Resources> <Storyboard x:Key="GridRotationStoryboard" RepeatBehavior="Forever"> <DoubleAnimation Storyboard.TargetName="CanvasRotation" Storyboard.TargetProperty="Angle" From="0.0" To="360.0" Duration="00:00:10.00"/> </Storyboard> </StackPanel.Resources> <!-- 原有按钮、Canvas代码不变 --> <Button Name="StartAnimationClick">Start animation</Button> <Button Name="StopAnimationClick" Click="stopAnimationClick">Stop animation</Button> <Canvas x:Name="Grid"> <Canvas.RenderTransform> <TransformGroup> <RotateTransform x:Name="CanvasRotation" CenterX="300" CenterY="300" Angle="0"/> </TransformGroup> </Canvas.RenderTransform> </Canvas> <StackPanel.Triggers> <EventTrigger RoutedEvent="Button.Click" SourceName="StartAnimationClick"> <BeginStoryboard Storyboard="{StaticResource GridRotationStoryboard}"/> </EventTrigger> </StackPanel.Triggers> </StackPanel>
- 后台代码直接从资源中获取Storyboard实例控制:
private void stopAnimationClick(object sender, RoutedEventArgs e) { Debug.Print("Stop animation"); var rotationSb = (Storyboard)stack.FindResource("GridRotationStoryboard"); rotationSb.Stop(); // 后续还可以调用rotationSb.Begin()/Pause()等方法做其他控制 }
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

