我的 wpf 动画代码有什么问题

what's wrong with my wpf animation code

我想重复我的动画几次,每次目标的 属性 会随着它被触发或动画完成而改变。

但动画只在第一次运行。

为了简化这个,我只是让一个矩形在 canvas 中从 0 移动到 400 10 次。代码如下。

我搜索过类似 'wpf repeat animation' 的问题,建议使用 seek() 方法或 rect.BeginAnimation(property, null),但对我不起作用。

private void init()
{
    Rectangle rect = new Rectangle();
    this.RegisterName("rect", rect);
    rect.Height = 100;
    rect.Width = 50;
    rect.Fill = Brushes.LightBlue;
    Canvas.SetTop(rect, 0);
    Canvas.SetLeft(rect, 0);
    myCanvas.Children.Add(rect);

    TargetAnimation(0);
}

private void TargetAnimation(int i)
{
    DoubleAnimation da = new DoubleAnimation();
    da.From = 0;
    da.To = 400;
    da.Duration = TimeSpan.FromSeconds(5);

    Storyboard.SetTargetName(da, "rect");
    Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
    Storyboard storyboard = new Storyboard();
    storyboard.Children.Add(da);
    storyboard.Completed += Storyboard_Completed;
    storyboard.Begin(this);

}

private void Storyboard_Completed(object sender, EventArgs e)
{
    if (i < 10)
        TargetAnimation(++i);
    else
        return;
}

您将 i 作为参数传递,但您没有使用它或它的值来确定。 所以你必须使用 if 语句限制 TargetAnimation(int i) 值等于目标动画值 i

我觉得你误会了StoryBoard.Completed。您应该在 da.Completed.

上申请委托

        private void TargetAnimation(int i)
        {
            DoubleAnimation da = new DoubleAnimation();
            da.From = 0;
            da.To = 400;
            da.Duration = TimeSpan.FromSeconds(5);
            da.Completed += Storyboard_Completed;
            Storyboard.SetTargetName(da, "rect");
            Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
            Storyboard storyboard = new Storyboard();
            storyboard.Children.Add(da);
            storyboard.Begin(this);
            //storyboard.Completed += Storyboard_Completed;
        }

你应该先注册完成的事件,然后再调用 begin 语句 像这样:

storyboard.Completed += Storyboard_Completed;
 storyboard.Begin(this);