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
相关产品推荐
相关产品推荐

