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

Thread与旋转动画功能异常,停止复位且无法循环运行问题求解

我的控件如下:
控件示意图

我尝试通过以下代码实现该控件的旋转效果:

全局变量定义:bool IsTriangleAnimRunning = false;

其余代码如下:

public void AnimateTriangle()
{
    var rotation = (int)((100 / 100d) * 45 * 1); // 最大旋转45度
    var duration = (int)(750 * (100 / 100d)); // 最长旋转耗时750ms

    while (IsTriangleAnimRunning != false)
    {
        MyTriangle.Dispatcher.BeginInvoke(
       (Action)(() =>
       {
           var anim = new DoubleAnimation
           {
               To = rotation,
               Duration = new Duration(TimeSpan.FromMilliseconds(duration)),
               AutoReverse = true
           };

           var rt = new RotateTransform();
           MyTriangle.RenderTransform = rt;
           rt.BeginAnimation(RotateTransform.AngleProperty, anim);

       }), DispatcherPriority.ContextIdle);

        Thread.Sleep(duration * 2);
    }
}

触发动画的按钮事件处理代码:

public void HandleTriangleEvents(object sender, RoutedEventArgs a) 
{
    Thread t_triagle = new Thread(new ThreadStart(this.AnimateTriangle));

    Button btn = (Button)sender;
    if (btn.Name == "btnStartTriangleAnim")
    {
        IsTriangleAnimRunning = true;
        btnStartTriangleAnim.IsEnabled = false;
        t_triagle.Start();
    }
    else
    {
        IsTriangleAnimRunning = false;
        btnStartTriangleAnim.IsEnabled = true;
        t_triagle.Abort();
    }
}

当前代码运行效果不符合预期:点击停止时控件会复位到初始位置,具体原因不明;同时动画仅能运行一次,无法持续循环。

期望实现的功能: 点击开始按钮后启动线程,控件持续往复旋转;点击停止按钮时动画停在当前旋转角度;再次点击开始可继续往复旋转。


我也尝试使用Task Async方案实现,但运行速度变慢且无法重复执行,测试代码如下:

private async Task AnimateTriangle()
{
    double rotation = 45d;
    double duration = 100d;

    var anim = new DoubleAnimation
    {
        To = rotation,
        Duration = TimeSpan.FromMilliseconds(duration),
        AutoReverse = true,
        RepeatBehavior = RepeatBehavior.Forever
    };

    var transform = MyTriangle.RenderTransform as RotateTransform;

    await Task.Factory.StartNew(() =>
    {
        while (IsTriangleAnimRunning != false)
        {
            MyTriangle.Dispatcher.Invoke(() =>
            {
                if (transform == null)
                {
                    transform = new RotateTransform();
                    MyTriangle.RenderTransform = transform;
                }

                transform.BeginAnimation(RotateTransform.AngleProperty, anim);

            }, DispatcherPriority.ContextIdle);        

            if (IsTriangleAnimRunning == false)
            {
                MyTriangle.Dispatcher.Invoke(() =>
                {
                    if (MyTriangle.RenderTransform is RotateTransform)
                    {
                        var angle = transform.Angle; // 当前动画值
                        transform.Angle = angle;
                        transform.BeginAnimation(RotateTransform.AngleProperty, null);
                    }
                }, DispatcherPriority.ContextIdle);
            }
        }
    });
}

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:05