c# - 如何在 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 方法——这就是我寻找同步替代方案的原因
解决方案
您可以通过附加到Completed
事件来排队动画:
<Storyboard x:Name="MyStoryboard" Completed="MyStoryboardCompleted" ...>
在你的代码后面
private async void MyStoryboardCompleted(object sender, EventArgs e)
{
await Task.Delay(delay); // wait
StartMyNextAnimation(); // start next
}
推荐阅读
- php - 从 symfony2.8 升级到 3.0 的表单的向后兼容性中断
- c# - 有什么方法可以将输入插入到连续运行的 webjob 中?
- html - Html 引导布局
- c# - MMVM Listbox 通过 MQTT 获取数据但不显示
- git - Git记录提交ID和先前日期之间的文件中的特定行?
- c++ - 函数调用:使用保证不会导致重定位的引用?
- r - 如何遍历矩阵列表并计算每个元素的矩阵逆(lapply)?
- java - 用于添加到列表(如果存在)或在 HashMap 中创建新列表的 Java 流
- socket.io - 推送通知的套接字
- java - 在Java中从字符串读取一个值到字符串数组