Анимировать движение перетаскивающего элемента WPF

#wpf #animation #adorner

#wpf #Анимация #элемент оформления

Вопрос:

в нашем приложении мы используем элемент оформления для некоторого поддельного перетаскивания. Элемент управления не следует за мышью, а устанавливается в определенные координаты на экране при перемещении мыши.

 double xPosLocation = (int)(dividerDistanceXAxis * virtualPosition)   YAxisData.SpacingLeft;
double yPosLocation = CalculateValueToYPosition(VirtualPriceOfVehicle);
DragAdorner.UpdatePosition(xPosLocation - offsetX, yPosLocation   offsetY);
  

Пока это работает нормально. Но с таким кодом элемент оформления переходит из одного местоположения в другое. Именно так это и должно было работать, но было бы неплохо иметь несколько плавных переходов движения, когда элемент оформления устанавливается в новое положение.

Можно ли это сделать? Поскольку я не вижу свойства position, я предполагаю, что невозможно выполнить двойную анимацию или что-то в этом роде.

Ответ №1:

Для анимации необходимо использовать DependencyProperty

 public class DragAdorner
{
    public Point Position
    {
        get { return (Point)GetValue(PositionProperty); }
        set { SetValue(PositionProperty, value); }
    }

    // Using a DependencyProperty as the backing store for PositionProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty PositionProperty =
        DependencyProperty.Register("Position", typeof(Point), typeof(DragAdorner), new UIPropertyMetadata(PositionChanged));

    private static void PositionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        UpdatePosition(Position);
    }
}
  

Тогда вы могли бы сделать что-то вроде этого (не тестировалось)

 double xPosLocation = (int)(dividerDistanceXAxis * virtualPosition)   YAxisData.SpacingLeft;
double yPosLocation = CalculateValueToYPosition(VirtualPriceOfVehicle);
Point newLocation = new Point(xPosLocation, yPosLocation);

PointAnimation myPointAnimation = new PointAnimation();
myPointAnimation.From = DragAdorner.Position;
myPointAnimation.To = newLocation;
myPointAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));

Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myPointAnimation);
Storyboard.SetTargetName(myPointAnimation, DragAdorner.Position);
myStoryboard.Begin();