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?
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 –