#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();