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)),
然后缓和功能永远不会消失。
答案 0 :(得分:0)
我不确定这会有什么帮助,但为什么不为EasingFunction使用共享实例而不是为每个动画创建一个单独的对象?从你的代码看,它们都是一样的吗?
我注意到的另一件事是你在Loaded回调中立即开始你的动画,但根据我对WPF和Silverlight的经验,Loaded事件对于框架非常特殊,你应该非常小心你在它做什么。如何调用故事板的Begin方法有点延迟:
this.Dispatcher.BeginInvoke(new Action(() => db.BeginStoryboard()));