C# BackColor属性在代码中未正确更改。关于我';我做错了?
中间C#dev在这里。试图通过编写一个简单的Simon clone(仅限私人学习,我没有任何版权,也不打算分发/销售)过渡到游戏编程,我被卡住了 以下是到目前为止完整代码的链接: 问题在于下面的C# BackColor属性在代码中未正确更改。关于我';我做错了?,c#,windows,winforms,C#,Windows,Winforms,中间C#dev在这里。试图通过编写一个简单的Simon clone(仅限私人学习,我没有任何版权,也不打算分发/销售)过渡到游戏编程,我被卡住了 以下是到目前为止完整代码的链接: 问题在于下面的PlayTile()方法: private void PlayTile(Button btnColorOfTile, Color lightedTileColor, SoundPlayer tileSoundPlayer, Color originalTileColor) { //
PlayTile()
方法:
private void PlayTile(Button btnColorOfTile, Color lightedTileColor, SoundPlayer tileSoundPlayer, Color originalTileColor)
{
// ***BUG03***
TilePress(btnColorOfTile, lightedTileColor, tileSoundPlayer);
// Small pause so tile can be lit before instantly changing back
Thread.Sleep(SLEEP_TIME);
TileRelease(btnColorOfTile, originalTileColor, tileSoundPlayer);
// Small pause between each tile play so that you can distingish multiple plays of the same tile.
Thread.Sleep(SLEEP_TIME);
}
这可以通过更改BackColor
属性来“点亮”磁贴,播放磁贴声音时暂停半秒(睡眠时间设置为500ms),然后将BackColor
更改回正常颜色
声音在暂停和其他情况下正常播放,但瓷砖没有改变颜色。我在TilePress()
中更改BackColor
属性,然后在TileRelease()
中将其更改回,该属性在MouseUp和MouseDown中为磁贴的事件处理程序调用,并且工作正常
你知道为什么PlayTile()
用于声音,但不改变背景色
属性吗
另外,如果你看到代码中有任何明显的错误,请告诉我。这对我来说都是关于学习的,所以需要建设性的批评
提前感谢您的帮助 Thread.Sleep会阻止您的UI线程(这意味着您的窗体无法处理任何窗口消息,如键盘、鼠标、移动、绘制等。这是一种“无响应”状态,不是所需的行为)
您可以改用async/await
例如:
async Task PlayTile()
{
this.BackColor = Color.Red;
await Task.Delay(500);
this.BackColor = Color.White;
await Task.Delay(500);
}
async private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
await PlayTile();
}
}
async Task PlayTile()
{
this.BackColor=Color.Red;
等待任务。延迟(500);
this.BackColor=Color.White;
等待任务。延迟(500);
}
异步私有无效按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<10;i++)
{
等待PlayTile();
}
}
您使用thread.Sleep(Sleep\u TIME)阻止UI线程代码>。使用定时器。(或wait Task.Delay(SLEEP_TIME)
)我知道Thread.SLEEP()。在这种情况下,需要这种行为(玩家没有控制权,计算机向玩家显示要模仿的模式)。我想让程序“点亮”瓷砖,暂停半秒钟,然后更改背景色。我没有使用等待Task.Delay()
,让我来研究一下。感谢您的回复。您是否尝试调用Invalidate();将颜色设置为表单后?我没有,让我查看Invalidate()
的作用。谢谢。@Sylverac我想我们谈的不一样。当我说阻塞时,这意味着您的表单无法处理任何窗口消息,如键盘、鼠标、移动、绘制等。这是一种“无响应”状态,不是期望的行为。我认为您完全让我走上了正确的道路,我只是在实现它时遇到了问题。我添加了一个更新,上面有更多问题。非常感谢你的帮助。不管怎样,我已经弄明白了。我还需要为PlayTile()
任务的所有调用添加等待。现在效果很好。谢谢