2009-07-06 9 views
9

Ich arbeite an einem Projekt, bei dem gekrümmte Pfade zwischen zwei Objekten gezeichnet werden. Momentan habe ich einen Testcode geschrieben, um mit Bezierkurven und Animationen herumzuspielen. Der erste Test besteht darin, den Endpunkt (Point3) einfach vom Ursprungsobjekt (einem Rechteck) zum Zielobjekt (einem anderen Rechteck) in einer geraden Linie zu verschieben. hier ist der Code, der die eigentliche Linie aufstellt:WPF-Animation - Animieren von Bezier-Kurvenpunkten

 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, so haben wir jetzt eine Linie zu einem Punkt zusammenbrach. Nun können diese Linie animieren, von _rect1 gehen zu _rect2 (die beiden Objekte an den Endpunkten):

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

funktioniert wunderbar. Wenn ich es jedoch mit einem Storyboard versuche, bekomme ich nichts. Hier ist der storyboarded Code:

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

Nichts bewegt sich. Ich vermute, es gibt ein Problem mit dem, was ich SetTarget oder SetTargetProperty füttere, aber ich kann es nicht herausfinden. Hat jemand Erfahrung mit dem Animieren von Linien-/Bezierpunkten in WPF?

+0

Ich bin mir nicht sicher, dass das Ihr Problem lösen wird, aber Sie könnten einige Inspiration in diesem Beitrag finden: http://www.japf.fr/?p=227 –

Antwort

0

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

nicht Storyboard-Mitglieder zu nennen Versuche (zB Start) im Konstruktor der Seite. Dies führt dazu, dass die Animation im Hintergrund fehlschlägt.

..in dem Fall, dass Sie das getan haben!

Das Beispiel auf dieser Seite legt auch die Eigenschaft Duration des Storyboard-Objekts fest.

Endlich ein allgemeiner Tipp, mit diesen Arten von UI-Objekten und seltsamen XAML-Objektdiagrammen, sobald Sie die Grundlagen am besten haben, um es in ein ResourceDictionary zu setzen und etwas wie 'Ressourcen ["Name"] als Storyboard zu verwenden hol es später zurück.

Hoffe, das ist hilfreich: sieht aus wie die fehlende Dauer sollte den Trick tun.

bearbeiten: Sieht aus wie Dauer auf automatisch voreingestellt ist, werde ich sehen, was ich sonst noch mit oben kommen kann, bitte Geduld mit mir .. :)

2

ich Ihren Code neu erstellt, und das funktioniert:

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

Das behebt es :) Es scheint, dass das Ziel die Kontrolle selbst sein muss.

gehen einen Schritt nach unten, wie folgt aus:

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

... gibt die InvalidOperationException:

'[Unknown] Eigenschaftswert in den Figuren‘Pfad [0] .Segments [ 0] .Point3 'zeigt auf unveränderliche Instanz von' System.Windows.Media.PathFigure '.