WPF Animation — анимация точек кривой Безье

Я работаю над проектом, который включает в себя рисование изогнутых путей между двумя объектами. В настоящее время я пишу тестовый код, чтобы поиграть с кривыми Безье и анимацией. Первый тест заключается в простом перемещении конечной точки (Point3) от исходного объекта (прямоугольника) к целевому объекту (другому прямоугольнику) по прямой линии. вот код, который устанавливает фактическую строку:

        connector = new Path();
        connector.Stroke = Brushes.Red;
        connector.StrokeThickness = 3;

        PathGeometry connectorGeometry = new PathGeometry();
        PathFigure connectorPoints = new PathFigure();
        connectorCurve = new BezierSegment();

        connectorPoints.StartPoint = new Point((double)_rect1.GetValue(Canvas.LeftProperty) + _rect1.Width / 2,
            (double)_rect1.GetValue(Canvas.TopProperty) + _rect1.Height / 2);
        connectorCurve.Point1 = connectorPoints.StartPoint;
        connectorCurve.Point2 = connectorPoints.StartPoint;
        connectorCurve.Point3 = connectorPoints.StartPoint;

        connectorPoints.Segments.Add(connectorCurve);
        connectorGeometry.Figures.Add(connectorPoints);
        connector.Data = connectorGeometry;
        MainCanvas.Children.Add(connector);

Итак, теперь у нас есть линия, свернутая в точку. Теперь давайте анимируем эту линию, идущую от _rect1 к _rect2 (два объекта в конечных точках):

        PointAnimation pointAnim = new PointAnimation();
        pointAnim.From = connectorCurve.Point3;
        pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width / 2,
            (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height / 2);
        pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5));
        board.Children.Add(pointAnim);

Прекрасно работает. Однако, когда я пытаюсь сделать это с помощью раскадровки, я ничего не получаю. Вот код раскадровки:

        Storyboard board = new Storyboard();
        PointAnimation pointAnim = new PointAnimation();
        pointAnim.From = connectorCurve.Point3;
        pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width / 2,
            (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height / 2);
        pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5));

        Storyboard.SetTarget(pointAnim, connectorCurve);
        Storyboard.SetTargetProperty(pointAnim, new PropertyPath(BezierSegment.Point3Property));
        board.Children.Add(pointAnim);
        board.Begin();

Ничего не движется. Я подозреваю, что есть проблема с тем, что я подаю SetTarget или SetTargetProperty, но не могу понять это. Есть ли у кого-нибудь опыт анимации линий/точек Безье в WPF?


person Community    schedule 06.07.2009    source источник
comment
Я не уверен, что это решит вашу проблему, но вы можете найти вдохновение в этом посте: japf. fr/?p=227   -  person Thomas Levesque    schedule 06.07.2009


Ответы (2)


Я воссоздал ваш код, и это работает:

Storyboard.SetTarget(pointAnim, connector);
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Data.Figures[0].Segments[0].Point3"));

Это исправляет :) Кажется, что целью должен быть сам элемент управления.

На один шаг вниз, вот так:

Storyboard.SetTarget(pointAnim, connectorGeometry);
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Figures[0].Segments[0].Point3"));

... дает InvalidOperationException:

Значение свойства «[Неизвестно]» в пути «Рисунки [0]. Сегменты [0]. Point3» указывает на неизменный экземпляр «System.Windows.Media.PathFigure».

person Kieren Johnstone    schedule 25.06.2010

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard(VS.95).aspx говорит:

Не пытайтесь вызывать элементы Storyboard (например, Begin) в конструкторе страницы. Это приведет к тихому сбою анимации.

..в случае, если вы делали это!

Образец на этой странице также задает свойство Duration объекта Storyboard.

Наконец, общий совет: с такими объектами пользовательского интерфейса и странными графами объектов XAML, как только вы освоите основы, лучше всего поместить их в ResourceDictionary и использовать что-то вроде «Ресурсы ["Имя"] в качестве раскадровки», чтобы вернуть его позже .

Надеюсь, что это полезно: похоже, что отсутствующая длительность должна помочь.

редактировать: похоже, что по умолчанию для продолжительности установлено значение «Автоматически», я посмотрю, что еще я могу придумать, пожалуйста, потерпите меня .. :)

person Kieren Johnstone    schedule 25.06.2010