我正在开展一个涉及在两个物体之间绘制弯曲路径的项目。目前,我一直在编写一些测试代码来使用贝塞尔曲线和动画。第一个测试只是将端点(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提供什么问题,但似乎无法解决这个问题。有没有人有WPF动画线/贝塞尔点动画的经验?
答案 0 :(得分: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:
路径'figure [0]中的'[Unknown]'属性值.Segments [0] .Point3'指向'System.Windows.Media.PathFigure'的不可变实例。
答案 1 :(得分:0)
http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard(VS.95).aspx说:
不要尝试在页面的构造函数中调用Storyboard成员(例如,Begin)。这将导致动画无声地失败。
..以防你这样做!
该页面上的示例还设置了Storyboard对象的 Duration 属性。
最后提供一般性的提示,有了这些UI对象和奇怪的XAML对象图,一旦你有了最好的基础知识,将它放在ResourceDictionary中并使用类似'Resources [“Name”]作为Storyboard'来获取它回来了。
希望这有用:看起来缺少的持续时间应该可以解决问题。
编辑:看起来默认情况下持续时间设置为自动,我会看到我还能想出什么,请耐心等待.. :)