2009-07-06 6 views
9

Je travaille sur un projet qui consiste à tracer des trajectoires courbes entre deux objets. Actuellement, j'ai écrit un code de test pour jouer avec les courbes de Bézier et l'animation. Le premier test consiste simplement à déplacer le point final (Point3) de l'objet d'origine (un rectangle) vers l'objet de destination (un autre rectangle), en ligne droite. voici le code qui met en place la ligne réelle:Animation WPF - Animation de points de courbe de Bézier

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

OK, donc nous avons maintenant une ligne effondrée à un point. Maintenant, cette ligne prend vie, allant de _rect1 à _rect2 (les deux objets aux points d'extrémité):

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

fonctionne à merveille. Cependant, quand j'essaye de le faire avec un storyboard, je n'ai rien. Voici le code du storyboard:

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

Rien ne bouge. Je soupçonne qu'il y a un problème avec ce que je nourris SetTarget ou SetTargetProperty, mais je n'arrive pas à le comprendre. Est-ce que quelqu'un a de l'expérience avec l'animation de points de ligne/Bézier dans WPF?

+0

Je ne suis pas sûr que cela puisse résoudre votre problème, mais vous pouvez trouver de l'inspiration dans ce post: http://www.japf.fr/?p=227 –

Répondre

0

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard(VS.95).aspx dit:

Ne tentez pas d'appeler les membres Storyboard (par exemple, Begin) dans le constructeur de la page. Cela entraînera l'échec de l'animation en mode silencieux.

..dans le cas où vous faisiez cela!

L'exemple sur cette page définit également la propriété Durée de l'objet Storyboard. Enfin une astuce générale, avec ces types d'objets d'interface utilisateur et les graphiques d'objets XAML bizarres une fois que vous avez les bases fonctionnant mieux pour le mettre dans un ResourceDictionary et utiliser quelque chose comme 'Resources ["Name"] comme Storyboard' le récupérer plus tard.

Espérons que c'est utile: ressemble à la durée manquante devrait faire l'affaire.

edit: On dirait que Durée est réglé sur Automatique par défaut, je verrai ce que je peux venir avec, s'il vous plaît garder avec moi .. :)

2

Je recréée votre code, et cela fonctionne:

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

Cela le corrige :) Il semble que la cible doit être le contrôle lui-même.

Franchir une étape vers le bas, comme ceci:

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

... donne la InvalidOperationException:

'[Unknown]' valeur de la propriété dans les figures du chemin [0] .Segments [ 0] .Point3 'pointe vers une instance immuable de' System.Windows.Media.PathFigure '.