BackColor 属性 代码中的更改不正确。关于我做错了什么的任何想法?

BackColor property not changing properly in code. Any ideas as to what I'm doing wrong?

这里是中级 C# 开发人员。试图通过编写一个简单的 Simon 克隆来过渡到游戏编程(仅供个人学习,我不拥有任何版权或打算 distribute/sell),但我被卡住了。

这里是完整代码的 link:Simon

问题出在下面的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属性到"light"向上的磁贴,暂停半秒(SLEEP_TIME 设置为 500 毫秒),同时播放方块的声音,并将 BackColor 改回正常颜色。

声音在暂停和其他一切情况下正常播放,但瓷砖没有改变颜色。我在 TilePress() 中更改了 BackColor 属性 并在 TileRelease() 中将其更改回 TileRelease() ,它在 MouseUp 和 MouseDown 中为图块的事件处理程序调用并且工作正常。

知道为什么 PlayTile() 对声音有效但没有改变 BackColor 属性 吗?

此外,如果您在代码中看到任何明显的错误,请告诉我。这对我来说都是为了学习,所以需要建设性的批评。

在此先感谢您的帮助!

Thread.Sleep 阻塞了您的 UI 线程(这意味着您的表单无法处理任何 window 消息,例如键盘、鼠标、移动、绘图等。它是一个 "Not Responding" 状态而不是期望的行为)。

您可以使用 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();
    }
}