2009-07-06 4 views
9

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

 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?

+0

Я не уверен, что решит вашу проблему, но вы можете найти вдохновение в этом посте: http://www.japf.fr/?p=227 –

ответ

0

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

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

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

Образец на этой странице также устанавливает Длительность свойство объекта Раскадровка.

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

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

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

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] Значение свойства в цифрах путь»[0] [.Segments 0] .Point3 указывает на неизменяемый экземпляр «System.Windows.Media.PathFigure».

Смежные вопросы