我的 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);
我想重复我的动画几次,每次目标的 属性 会随着它被触发或动画完成而改变。
但动画只在第一次运行。
为了简化这个,我只是让一个矩形在 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);