一段时间后,在wpf动画中自动关闭缓动功能

时间:2014-04-10 17:18:53

标签: c# wpf animation storyboard

WPF和c#。 c#代码中的动画。 我有很多点的路径动画(> 1000)。使用一个故事板以编程方式创建动画,并使用简易功能指向动画。重复行为设置为永久。一段时间后,缓和功能关闭。我认为这是一种优化。我可以关闭它以便永久设置缓和功能吗?

这是我的mainwindow_loaded函数。我的xaml代码中只有一个名为grid的Grid。

void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Random r = new Random(10);

        Storyboard sb = new Storyboard();

        Path p = new Path
        {
            Width = 500,
            Height = 500,

            Name = "Path",
            Fill = Brushes.Green,
            HorizontalAlignment = System.Windows.HorizontalAlignment.Left,
            Margin = new Thickness(25, 25, 0, 0),
            VerticalAlignment = System.Windows.VerticalAlignment.Top
        };

        PathGeometry pg = new PathGeometry();
        var pf = new PathFigure { StartPoint = new Point(0, 250) };

        for (int i = 0; i < this.ActualWidth; i++)
        {
            LineSegment ls = new LineSegment { Point = new Point(i, 50) };
            var pa = new PointAnimation
            {
                To = new Point(i, 80),
                Duration = new Duration(new TimeSpan(0, 0, 0, 2)),
                BeginTime = new TimeSpan(0, 0, 0, 0, i * 10),  //+ r.Next(200)
                AutoReverse = true,
                RepeatBehavior = RepeatBehavior.Forever,
                EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut }
            };

            Storyboard.SetTargetProperty(pa, new PropertyPath("(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[" + i + "].(LineSegment.Point)"));
            Storyboard.SetTarget(pa, p);

            sb.Children.Add(pa);

            pf.Segments.Add(ls);
        }

        LineSegment endSegment = new LineSegment { Point = new Point(this.ActualWidth, 250) };
        pf.Segments.Add(endSegment);

        pg.Figures.Add(pf);

        p.Data = pg;

        grid.Children.Add(p);

        sb.Begin();
    }

尝试将+ r.Next(200)放在代码中,以使该行看起来像

BeginTime = new TimeSpan(0, 0, 0, 0, i * 10 + r.Next(200)),

然后缓和功能永远不会消失。

1 个答案:

答案 0 :(得分:0)

我不确定这会有什么帮助,但为什么不为EasingFunction使用共享实例而不是为每个动画创建一个单独的对象?从你的代码看,它们都是一样的吗?

我注意到的另一件事是你在Loaded回调中立即开始你的动画,但根据我对WPF和Silverlight的经验,Loaded事件对于框架非常特殊,你应该非常小心你在它做什么。如何调用故事板的Begin方法有点延迟:

this.Dispatcher.BeginInvoke(new Action(() => db.BeginStoryboard()));