You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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抽到资源字典中,方便全局控制

如果你后续还需要对动画做启动、暂停、重置等更复杂的控制,建议把动画定义到资源中,方便前后台访问:

  1. 先修改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>
  1. 后台代码直接从资源中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:24:02