一次运行一个动画

时间:2012-08-26 06:32:43

标签: c# wpf wpf-controls

我正在学习c#和wpf。我在Visual Studio 2012中运行了该项目。为了更好地学习C#和WPF,我正在制作一个恰好是Simon Says游戏的练习应用程序。我有两个窗户。第一个窗口有一个“播放!”显示下一个窗口的按钮。这个窗口有4个按钮。我有一个整数数组,以便玩家必须按顺序按下按钮。为了向玩家展示订单,我想按照数组中生成的顺序逐个动画每个按钮。

这些按钮有4种不同的颜色,每个我的动画都来自Blend中的Storyboard。动画将按钮从原始颜色变为红色,然后在两秒钟内返回。

动画可以正常工作,但所有按钮同时显示动画。我想要第一个按钮来制作动画,然后当它完成时,下一个按钮等等。我怎样才能最好地使用C#和WPF。谢谢您的帮助。如果需要,我可以上传代码。

运行动画的功能

public void startbtn_Click(object sender, RoutedEventArgs e)
{
    // Show the animation sequence for each button
    // up until the current level. (getCurrentLevel is currently set to 5)
    for (int i = 0; i <= engine.getCurrentLevel(); i++)
    {
        // engine.animate(i) returns the button at sequence i to animate
        animate(engine.animate(i));
    }
}

private void animate(int index)
{
    // Storyboard for each button is in the format of ButtonAnimation_INDEX where INDEX is 1, 2, 3 or 4
    Storyboard btnAnimation = (Storyboard)this.Resources["ButtonAnimation_" + index];
    if (btnAnimation != null)
    {
        btnAnimation.Begin();   
    }
}

1 个答案:

答案 0 :(得分:0)

我使用Completed事件想出来了。我现在有功能检查当前序列是否低于当前级别。如果是这意味着可以动画另一个按钮。因此,已完成的事件将再次运行该功能,并使用下一个按钮来设置动画。

public void startbtn_Click(object sender, RoutedEventArgs e)
{
    engine.resetSequence(); // Start from sequence 0
    // Animate first button
    animate(engine.animate()); 
}


private void animate(int index)
{

    // Storyboard for each button is in the format of ButtonAnimation_INDEX where INDEX is 1, 2, 3 or 4
       Storyboard btnAnimation = (Storyboard)this.Resources["ButtonAnimation_" + index];
       // Added completed event function handler
       btnAnimation.Completed += btnAnimation_Completed;
       if (btnAnimation != null)
       {
           btnAnimation.Begin();   
        }
}


void btnAnimation_Completed(object sender, EventArgs e)
{
     // If another button can be animated in the sequence
     if (engine.CurrentSequence() < engine.getCurrentLevel())
     {
         // Increment the sequence position
         engine.nextSequence();
         // Run the animation with the next button
         animate(engine.animate());
     }
}