Анимация WPF - Анимирующий точки Кривой Безье

Я работаю над проектом, который включает изогнутые контуры рисунка между двумя объектами. В настоящее время я писал некоторый тестовый код для проигрывания вокруг с кривыми Безье и анимацией. Первый тест должен просто переместить конечную точку (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, но, может казаться, не понимаю это. У кого-либо есть опыт с анимацией строки / bezier точки в WPF?

9
задан 6 July 2009 в 19:34
поделиться

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:

'[Unknown]' в пути 'Figures [0] .Segments [0] .Point3' указывает на неизменяемый экземпляр System.Windows.Media.PathFigure.

2
ответ дан 5 December 2019 в 02:08
поделиться

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

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

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

Пример на этой странице также устанавливает свойство Duration объекта Storyboard.

И, наконец, общий совет: при работе с подобными объектами пользовательского интерфейса и странными графами объектов XAML после того, как у вас заработают основы, лучше всего поместить их в ResourceDictionary и использовать что-то вроде 'Resources["Name"] as Storyboard', чтобы получить их позже.

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

edit: Похоже, что Duration по умолчанию установлена на Automatic, я посмотрю, что еще можно придумать, пожалуйста, потерпите... :)

.
0
ответ дан 5 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: