如何在运行时在代码块结束之前更改按钮的backColor

时间:2019-03-14 14:20:14

标签: c# winforms

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

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

button1已经是深绿色。当我单击button1时,什么都没有改变。

如何在5秒钟内观察到这种变化?

3 个答案:

答案 0 :(得分:2)

之所以不起作用,是因为Thread.Sleep()阻止了线程的完成。

仅当应用程序不执行任何操作时(即方法完成后),窗口才会重绘。如果您删除将其更改为//globol object for contacts database // Business Logic for AddressBook --------- function AddressBook(contacts) { this.contacts = []; } AddressBook.prototype.addContact = (contact) => { this.contacts.push(contact); } // Business Logic for Contacts --------- function Contact(firstName, lastName, phoneNumber) { this.firstName = firstName, this.lastName = lastName, this.phoneNumber = phoneNumber } Contact.prototype.fullName = () => { return this.firstName + " " + this.lastName; } var addressBook = new AddressBook(); var contact = new Contact("Ada", "Lovelace", "503-555-0100"); var contact2 = new Contact("Grace", "Hopper", "503-555-0199"); addressBook.addContact(contact); addressBook.addContact(contact2); console.log(addressBook.contacts); 的行,则会在五秒钟后看到其颜色更改。

您应该使用计时器来解决问题。

如果需要,您可以强制其提早刷新界面,而无需调用DarkGreen来调用该方法,该调用将反映您所做的更改,例如颜色更改。

Application.DoEvents();

请注意,在带有用户界面的程序中,使线程休眠是一个坏主意,但出于说明目的,它将向您展示如何使其变色。

答案 1 :(得分:2)

您的问题是因为UI线程被阻止。您需要在单独的线程中运行此逻辑。请尝试以下代码:

private async void button1_Click(object sender, EventArgs e)
{
    button1.BackColor = Color.LimeGreen;
    await Task.Run(() =>
    {
        System.Threading.Thread.Sleep(5000);
        button1.BackColor = Color.DarkGreen;
    });
}

这会将您的按钮转到LimeGreen,然后等待5秒钟,然后将其返回到DarkGreen。之所以有效,是因为我们将其旋转到新线程中,因此不会锁定UI。

答案 2 :(得分:0)

我不建议使用Thread.Sleep(),因为它将冻结您的Interface。另外,您需要刷新按钮,以便显示更改。 您可以使用异步和等待方法来延迟按钮颜色更改 在button1_click函数的private关键字之后添加异步 并创建异步Task函数,并使用await awaiting()删除Thread.Sleep()函数。

public partial class Form1 : Form
{
    public Form1()
{
    InitializeComponent();
}

private async void button1_Click(object sender, EventArgs e)
{
    button1.BackColor = Color.Lime;
    button1.Refresh();
    await awaiting();

    button1.BackColor = Color.DarkGreen;
}
private async Task awaiting() {
        await Task.Delay(5000);
    }
}