Как временно сделать паузу между двумя отдельными анимациями в WPF - PullRequest
2 голосов
/ 13 июля 2020

Я новичок в Windows Presentation Foundation и C#. В качестве стартап-проекта я решил создать или, лучше сказать, воссоздать игру «Саймон» в WPF.

Изображение игры Simon:

введите описание изображения здесь

Ниже приведена часть кода, обрабатывающего вспышки:

        {

            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

            };

Выше анимация непрозрачности для fla sh.

Итак, у Саймона каждый цвет мигает, и всегда есть небольшой пауза между ними. Прежде всего, я не совсем уверен, как go обойти это. То, что я делаю сейчас, работает , но мне было интересно, есть ли альтернатива этому. Меня не интересуют методы asyn c и тому подобное - моя программа синхронна - я ищу синхронную альтернативу для паузы между вспышками.

Также я понимаю, что этот код не идеален - я следует использовать Tasks вместо asyn c void метода - вот почему я ищу синхронную альтернативу

1 Ответ

1 голос
/ 13 июля 2020

Вы можете поставить свою анимацию в очередь, прикрепив к событию Completed:

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

и в своем коде за

private async void MyStoryboardCompleted(object sender, EventArgs e)
{
    await Task.Delay(delay); // wait
    StartMyNextAnimation();  // start next
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...