Новичок в WPF: удаляет ли анимация прикрепленное свойство?

Я пытаюсь изучить WPF и анимацию. У меня есть простая программа, которая позволяет пользователю перемещать эллипс с помощью мыши. Когда кнопка мыши отпущена, положение эллипса анимируется по направлению к верхней части экрана.

Это отлично работает в первый раз, когда я хватаю эллипс. Но во второй раз, когда я хватаю эллипс, я больше не могу изменить его положение по оси Y (но я все еще могу изменить положение по оси X). Удаляет ли анимация прикрепленное Canvas.Top свойство? Как исправить эту проблему?

Вот код запуска анимации (находится в обработчике MouseUp)

Duration duration = new Duration(TimeSpan.FromSeconds(5.0*oldY/1000));

DoubleAnimation anim = new DoubleAnimation(oldY, 0, duration); // move to top of canvas

_shapeSelected.BeginAnimation(Canvas.TopProperty, anim);

а вот обработчик перемещения мыши

    private void Canvas_MouseMove_1(object sender, MouseEventArgs e)
    {

        if (_shapeSelected != null)
        {
            Point pt = e.GetPosition(theCanvas);

            Canvas.SetLeft(_shapeSelected, (pt.X-_posOfMouseOnHit.X) + _posOfShapeOnHit.X );
            Canvas.SetTop(_shapeSelected,  (pt.Y-_posOfMouseOnHit.Y) + _posOfShapeOnHit.Y );

        }

    }

person ragnarius    schedule 19.11.2014    source источник


Ответы (2)


Задайте для анимации FillBehavior значение Stop. Поскольку свойство теперь возвращается к своему текущему локальному значению, когда анимация завершено, вы также должны установить локальное значение после запуска анимации.

var anim = new DoubleAnimation(oldY, 0, duration, FillBehavior.Stop);

_shapeSelected.BeginAnimation(Canvas.TopProperty, anim);
Canvas.SetTop(_shapeSelected, 0); 
person Clemens    schedule 19.11.2014
comment
Третий аргумент BeginAnimation — это HandoffBehavior, а не FilllBehavior. - person ragnarius; 19.11.2014
comment
В моем ответе нет третьего аргумента для BeginAnimation. Вместо этого это еще один аргумент конструктора DoubleAnimation. FillBehavior.Stop это именно то, что вам нужно здесь. - person Clemens; 19.11.2014

Как вы можете видеть в здесь в MSDN значения, заданные анимацией (ранг 2), имеют более высокий приоритет, чем локальное значение (ранг 3). Если вы хотите снова установить значение вручную, вы должны остановить или удалить анимацию раньше. (См. также раздел «Принуждение, анимация и базовое значение» на этом сайте)

person Fratyx    schedule 19.11.2014