Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中带有BeginAnimation的动画序列_C#_Wpf_Animation_Graphics - Fatal编程技术网

C# WPF中带有BeginAnimation的动画序列

C# WPF中带有BeginAnimation的动画序列,c#,wpf,animation,graphics,C#,Wpf,Animation,Graphics,我正在尝试使用WPF在3D中设置一些旋转的动画,如果我手动(单击)触发它们,一切都很好,但是如果我计算应在Viewport3D上进行的移动,所有动画似乎都会同时停止 计算移动的代码如下所示: for(int i=0; i<40; i++){ foo(i); } 轴和角度的计算并不是耗时的简单属性,因此我猜问题在于所有动画都会触发下一帧,因为当前帧“结束”时计算已经完成 如何以代码(而不是XAML)顺序显示这些动画,而不是一次显示所有动画 PS:所有内容都是C#,没有XAML。您可

我正在尝试使用WPF在3D中设置一些旋转的动画,如果我手动(单击)触发它们,一切都很好,但是如果我计算应在Viewport3D上进行的移动,所有动画似乎都会同时停止

计算移动的代码如下所示:

for(int i=0; i<40; i++){
    foo(i);
}
轴和角度的计算并不是耗时的简单属性,因此我猜问题在于所有动画都会触发下一帧,因为当前帧“结束”时计算已经完成

如何以代码(而不是XAML)顺序显示这些动画,而不是一次显示所有动画


PS:所有内容都是C#,没有XAML。

您可以向a添加多个动画,并将每个动画的持续时间设置为以前动画的持续时间总和:

var storyboard = new Storyboard();
var totalDuration = TimeSpan.Zero;

for (...)
{
    var rotation = new AxisAngleRotation3D(axis, angle);
    var transform = new RotateTransform3D(rotation, new Point3D(0, 0, 0));
    var duration = TimeSpan.FromMilliseconds(370);
    var animation = new DoubleAnimation(0, angle, duration);

    animation.BeginTime = totalDuration;
    totalDuration += duration;

    Storyboard.SetTarget(animation, rotation);
    Storyboard.SetTargetProperty(animation, new PropertyPath(AxisAngleRotation3D.AngleProperty));

    storyboard.Children.Add(animation);
}

storyboard.Begin();
请注意,我还没有测试上面的代码,因此对于任何错误,我深表歉意



或者,您创建动画的方式是,每个动画(从第二个动画开始)在前一个动画的处理程序中启动。

您可以将多个动画添加到,并将每个动画的持续时间设置为前一个动画的持续时间之和:

var storyboard = new Storyboard();
var totalDuration = TimeSpan.Zero;

for (...)
{
    var rotation = new AxisAngleRotation3D(axis, angle);
    var transform = new RotateTransform3D(rotation, new Point3D(0, 0, 0));
    var duration = TimeSpan.FromMilliseconds(370);
    var animation = new DoubleAnimation(0, angle, duration);

    animation.BeginTime = totalDuration;
    totalDuration += duration;

    Storyboard.SetTarget(animation, rotation);
    Storyboard.SetTargetProperty(animation, new PropertyPath(AxisAngleRotation3D.AngleProperty));

    storyboard.Children.Add(animation);
}

storyboard.Begin();
请注意,我还没有测试上面的代码,因此对于任何错误,我深表歉意



或者创建动画时,每个动画(从第二个动画开始)都是在前一个动画的处理程序中启动的。

我得说这有点好,但动画仍然是分块进行的,我的意思是同时触发,一些触发器可以。那么在前一个完整的处理程序中启动每一个怎么样?我得说这会更好一些,但动画仍然是分块进行的,我的意思是一些触发器同时启动,一些触发器可以。那么在前一个完整的处理程序中启动每一个怎么样?