滑块值,使用DoubleAnimation类更改旋转的持续时间

本文关键字:旋转 持续时间 DoubleAnimation 使用 | 更新日期: 2023-09-27 18:28:43

我正在尝试使用WPF中的DoubleAnimation类来制作基本动画。单击按钮,矩形旋转。cs代码是

DoubleAnimation da = new DoubleAnimation();
da.From = 0; // start from 0 to 360, full circle
da.To = 360;
da.Duration = new Duration(TimeSpan.FromSeconds(0.5));
da.RepeatBehavior = RepeatBehavior.Forever;
RotateTransform rt = new RotateTransform();
rectangle1.RenderTransform = rt;
rt.BeginAnimation(RotateTransform.AngleProperty, da);

我想做的是用滑块值更新da.Duration = new Duration(TimeSpan.FromSeconds(0.5))值。

尝试使用滑块值绑定,但无法正确获取。

滑块值,使用DoubleAnimation类更改旋转的持续时间

仅仅更改Duration是不够的。动画由内部AnimationClock控制的速度。此时钟在您调用BeginAnimation()后仅初始化一次。因此,您必须使用ApplyAnimationClock()方法更新内部AnimationClock

还应注意,还应将From属性设置为当前已设置动画的值,以便在更改滑块的值时,Angle将平滑地设置动画(无需从0重新启动):

//The ValueChanged handler for your Slider
private void slider_ValueChanged(object sender, 
                                 RoutedPropertyChangedEventArgs e){
   da.Duration = new Duration(TimeSpan.FromMilliseconds(yourSlider.Value));
   da.From = rt.Angle;
   rt.ApplyAnimationClock(RotateTransform.AngleProperty, da.CreateClock());
}

请注意,我假设滑块的值对应于毫秒的数量,因此如果您不希望矩形旋转得过快,则滑块的Maximum值应该足够大(大约几千)。此外,您声明的所有变量都应该能够在ValueChanged处理程序中访问。

更重要的一点是,您应该在这里使用By属性,而不是To,如下所示:

da.By = 360;

这样,您就可以更新From,而不必关心To(它总是旋转360度)。