C# 什么';我的wpf动画代码有问题吗

C# 什么';我的wpf动画代码有问题吗,c#,wpf,animation,repeat,C#,Wpf,Animation,Repeat,我想重复我的动画几次,每次目标的属性会随着它的触发或动画的完成而改变 但是动画只是第一次起作用 为了简化这一点,我只让一个矩形在画布中从0移动到400 10次。下面是代码 我搜索过像“wpf repeat animation”这样的问题,它建议使用seek()方法或rect.BeginAnimation(property,null),但对我不起作用 private void init() { Rectangle rect = new Rectangle(); this.Regis

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

但是动画只是第一次起作用

为了简化这一点,我只让一个矩形在画布中从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;
}
private void init()
{
矩形rect=新矩形();
这个注册表名(“rect”,rect);
直线高度=100;
矩形宽度=50;
rect.Fill=brusks.LightBlue;
Canvas.SetTop(rect,0);
Canvas.SetLeft(rect,0);
myCanvas.Children.Add(rect);
目标化(0);
}
私有无效目标化(int i)
{
DoubleAnimation da=新的DoubleAnimation();
da.From=0;
da.To=400;
da.持续时间=从秒开始的时间跨度(5);
故事板.SetTargetName(da,“rect”);
Storyboard.SetTargetProperty(da,新属性路径(Canvas.LeftProperty));
情节提要情节提要=新情节提要();
故事板。儿童。添加(da);
情节提要.已完成+=情节提要\已完成;
故事板。开始(这个);
}
私有void情节提要_已完成(对象发送方,事件参数e)
{
如果(i<10)
目标化(++i);
其他的
返回;
}

您将
i
作为参数传递,但未使用它或它的值来确定。
因此,您必须使用if语句限制
TargetAnimation(int i)
值,该语句等于目标动画值,即
i

,我认为您误解了StoryBoard.Completed。您应该在da上应用委托。已完成

private void TargetAnimation(inti)
{
DoubleAnimation da=新的DoubleAnimation();
da.From=0;
da.To=400;
da.持续时间=从秒开始的时间跨度(5);
da.Completed+=情节提要_Completed;
故事板.SetTargetName(da,“rect”);
Storyboard.SetTargetProperty(da,新属性路径(Canvas.LeftProperty));
情节提要情节提要=新情节提要();
故事板。儿童。添加(da);
故事板。开始(这个);
//情节提要.已完成+=情节提要\已完成;

}
在调用begin语句之前,应该先注册已完成的事件 像这样:

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

为什么要将参数
i
传递给
TargetAnimation
方法?你没有使用它…为什么不使用
da.RepeatBehavior=RepeatBehavior.Forever?很抱歉没有说清楚
i
是一个全局参数@皮科希只是简化了问题。实际上,我每次都需要更改目标的属性,比如移动距离或持续时间@杰罗恩万兰根