短暂改变按钮颜色

3
我想将按钮的背景颜色更改为青色,持续几秒钟,然后再改回正常状态。但不知道为什么,它并没有起作用。我尝试了一些方法,虽然有些工作可以实现,但背景颜色没有变化。下面是我到目前为止尝试过的:
private void button1_Click(object sender, EventArgs e)
{
    button1.BackColor = Color.Lime;
    Thread.Sleep(2000);
    button1.BackColor = SystemColors.Control;
}

希望有人能够帮助我解决这个问题!


为什么你不尝试使用Xaml来做这件事,它更容易。 - Moez Rebai
3个回答

6

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

或者,您也可以像Jon Skeet在this答案中提到的那样,利用awaitTask.Delay来实现。

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只保证在那段时间内不处理它,而不保证它会在那个时间点重新激活,仅保证在休眠期后的某个时间点(一旦完成处理当前活动的任何其他线程)。

由于您在UI线程上添加了Thread.Sleep,因此您实际上会在睡眠期间锁定整个应用程序。另一方面,await Task.Delay不会阻塞线程,但是会在await中的任务完成后(在本例中为延迟操作)返回到该函数的代码行。这允许所有其他方法继续正常运行(按钮单击将正常工作等)。此方法的附加优点是将所有相关代码保留在一个位置,而不是将其部分放在另一个方法中。


5

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

    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;
        }

0

如果你正在使用XAML技术,你也可以使用Storyboard。我不会发布实现细节,因为它们可能因目标技术而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接