短时间更改按钮颜色

我想将按钮的背景颜色更改为几秒钟,然后将其更改为正常。 由于某种原因,它根本不起作用,我必须等待那些秒,我测试的一些东西也可以工作,但backgroundcolor没有改变。 这是我到目前为止所尝试的:

private void button1_Click(object sender, EventArgs e) { button1.BackColor = Color.Lime; Thread.Sleep(2000); button1.BackColor = SystemColors.Control; } 

希望有人可以帮我解决这个问题!

你需要一个计时器。 将工具箱中的计时器控件添加到表单中。 双击它以添加计时器刻度事件处理程序

  private void button1_Click(object sender, EventArgs e) { button1.BackColor = Color.Lime; //Set time between ticks in miliseconds. timer1.Tick=2000; //Start timer, your program continues execution normaly timer1.Start; //If you use sleep(2000) your program stop working for two seconds. } //this event will rise every time set in Tick (from start to stop) private void timer1_Tick(object sender, EventArgs e) { //When execution reach here, it means 2 seconds have passed. Stop timer and change color timer1.Stop; button1.BackColor = SystemColors.Control; } 

正如Horaciux所提到的,您可以使用Timer对象来执行此操作。

或者,您可以使用awaitTask.Delay ,如Jon Skeet在本回答中所述。

 private async void button1_Click(object sender, EventArgs e) { button1.BackColor = Color.Lime; await Task.Delay(2000); button1.BackColor = SystemColors.Control; } 

Thread.Sleep的问题在于它是一个阻塞操作 – 因为它将阻止有问题的线程上发生的任何事情。 还有其他问题 – 主要是Thread.Sleep不保证在指定的时间内重新激活线程。 当你执行Thread.Sleep ,你基本上告诉CPU你的线程不需要在指定的时间内处于活动状态 – 但是,CPU只保证它不会在那个时候处理它 – 它不保证它将在那时重新激活,仅在睡眠期后的某个时刻(一旦它完成处理当前活动的任何其他线程)。

由于您要将Thread.Sleep添加到UI线程,因此您可以在睡眠期间有效地锁定整个应用程序。 另一方面, await Task.Delay不会阻塞线程,但是一旦await的任务完成(在这种情况下,就是一个Delay动作),它将返回到函数中的那行代码。 这允许所有其他方法继续正常运行(按钮点击将正常工作等)。 此方法的另一个优点是将所有相关代码保存在一个位置,而不是将其中的一部分保存在不同的方法中。

或者,如果您正在使用XAML技术,则可以使用Storyboard 。 我没有发布实施细节,因为它们可能会因目标技术而异。