首页 > 解决方案 > 如何在 WPF 中的两个单独动画之间临时暂停

问题描述

我是 Windows Presentation Foundation 和 C# 的初学者。作为一个启动项目,我决定创建,或者我应该说在 WPF 中重新创建“西蒙”游戏。

西蒙游戏画面:

在此处输入图像描述

以下是处理闪烁的部分代码:

        {

            if (watchMode)
            {
                // In watch mode the user can't click on the simon button.
                return;
            }

            DoubleAnimation opacityClickAnimation = new DoubleAnimation
            {
                From = 0,
                To = 1,
                Duration = new Duration(TimeSpan.FromSeconds(0.3)),
                AutoReverse = true

            };
            List<int> clickList = new List<int>();

            Path objButton = (Path)sender;

            // Switching all the possible options - determining them by name.
            // This method is much easier than creating 4 different events.
            switch (objButton.Name)
            {
                case "RedBlock":
                    RedBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
                    await Task.Delay(taskDelay);
                    clickList.Add(redButtonValue);

                    lightValueClicked = redButtonValue;

                    break;
                case "BlueBlock":
                    BlueBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
                    await Task.Delay(taskDelay);
                    clickList.Add(blueButtonValue);

                    lightValueClicked = blueButtonValue;

                    break;
                case "OrangeBlock":
                    OrangeBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
                    await Task.Delay(taskDelay);
                    clickList.Add(orangeButtonValue);

                    lightValueClicked = orangeButtonValue;

                    break;
                case "GreenBlock":
                    GreenBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
                    await Task.Delay(taskDelay);
                    clickList.Add(greenButtonValue);

                    lightValueClicked = greenButtonValue;

                    break;

            }

我希望看到这篇文章的人你熟悉西蒙的工作方式,如果没有,请在线搜索。我创建了一个双重动画,(opacityClickAnimation)

   DoubleAnimation opacityClickAnimation = new DoubleAnimation
            {
                From = 0,
                To = 1,
                Duration = new Duration(TimeSpan.FromSeconds(0.3)),
                AutoReverse = true

            };

上面是闪光灯的不透明动画。

所以在西蒙身上,每一种颜色都在闪烁,中间总是有轻微的停顿。首先,我不完全确定如何解决这个问题。我现在正在做的事情有效,但我想知道是否有替代方法。我对异步方法和类似的东西不感兴趣——我的程序是同步的——我正在寻找一种同步的替代方案来在闪烁之间暂停。

我也意识到这段代码并不完美——我应该使用 Tasks 而不是 async void 方法——这就是我寻找同步替代方案的原因

标签: c#wpfxaml

解决方案


您可以通过附加到Completed事件来排队动画:

<Storyboard x:Name="MyStoryboard" Completed="MyStoryboardCompleted" ...>

在你的代码后面

private async void MyStoryboardCompleted(object sender, EventArgs e)
{
    await Task.Delay(delay); // wait
    StartMyNextAnimation();  // start next
}

推荐阅读