【问题标题】:what's wrong with my wpf animation code [duplicate]我的wpf动画代码有什么问题[重复]
【发布时间】:2016-05-23 08:42:55
【问题描述】:

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

但动画只在第一次工作。

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

我搜索过类似“wpf 重复动画”这样的问题,建议使用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 传递给你的TargetAnimation 方法?你没有使用它...
  • 为什么不使用da.RepeatBehavior = RepeatBehavior.Forever;
  • 很抱歉没有说清楚。 i 是一个全局参数。 @Pikoh
  • 我只是简化了问题。实际上,我每次都需要更改目标的属性,例如移动距离或持续时间。 @JeroenvanLangen

标签: c# wpf animation repeat


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为您误解了 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;
            }

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        相关资源
        最近更新 更多