在WPF中暂停旋转动画

时间:2016-07-04 08:35:54

标签: wpf animation

我可以控制旋转图像的动画。

我想随时启动,暂停和恢复旋转动画。

我在代码背后有一切:

public partial class Wheel32Control : UserControl
    {

        public Wheel32Control()
        {
            InitializeComponent();
            img.RenderTransform = new RotateTransform();
            img.RenderTransformOrigin = new Point(0.5, 0.5);

            _daRotate = new DoubleAnimation(0, 360, TimeSpan.FromSeconds(2))
            {
                RepeatBehavior = RepeatBehavior.Forever
            };
        }

        private DoubleAnimation _daRotate;

        private bool _rotate;
        public bool Rotate
        {
            get
            {
                return _rotate;
            }
            set
            {
                _rotate = value;

                if (_rotate)
                    RotateStart();
                else
                    RotateStop();
            }
        }

        private void RotateStart()
        {
            this.img.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, _daRotate);
        }

        private void RotateStop()
        {
            this.img.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, null);
        }
    }

我的XAML部分:

<Image Name="img" Source="/Plt;component/Resources/Images/Kolo_32_3.png"
           Stretch="None"/>

我的问题:

当我停止动画时 - 它会“跳”到“零点”。我想让它停在我停下来的地方。

我的代码将动画设置为“null”,因为我是WPF的新手,这只是停止我知道的动画的方法。

1 个答案:

答案 0 :(得分:3)

不是通过设置FromTo设置动画,而是可以设置一定数量的动画:

_daRotate = new DoubleAnimation
{
    By = 360,
    Duration = TimeSpan.FromSeconds(2),
    RepeatBehavior = RepeatBehavior.Forever
};

在删除动画之前,将RotateTransform的Angle属性设置为当前的动画值。这是通过调用属性getter来完成的,它返回&#34;当前有效的属性值&#34;,并将返回的值赋给属性setter,它设置&#34; local属性值&#34;。

private void RotateStop()
{
    var rotateTransform = (RotateTransform)img.RenderTransform;
    rotateTransform.Angle = rotateTransform.Angle; // looks strange, but works.
    rotateTransform.BeginAnimation(RotateTransform.AngleProperty, null);
}

该行

rotateTransform.Angle = rotateTransform.Angle;
如果用Angle属性的CLR包装器中的代码替换它,可能更容易理解

rotateTransform.SetValue(RotateTransform.AngleProperty,
    rotateTransform.GetValue(RotateTransform.AngleProperty));