9

我正在做一个涉及在两个对象之间绘制曲线路径的项目。目前,我一直在编写一些测试代码来处理贝塞尔曲线和动画。第一个测试只是将端点 (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 中动画线/贝塞尔点的经验?

4

2 回答 2

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:

路径“Figures[0].Segments[0].Point3”中的“[Unknown]”属性值指向“System.Windows.Media.PathFigure”的不可变实例。

于 2010-06-25T17:14:00.763 回答
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"] as Storyboard'之类的东西稍后将其取回.

希望这会有所帮助:看起来缺少的 Duration 应该可以解决问题。

编辑:看起来持续时间默认设置为自动,我会看看我还能想出什么,请多多包涵.. :)

于 2010-06-25T16:56:14.707 回答