c# - 从 C# WinForm 应用程序中的循环更改标签背景色

标签 c# winforms

我的应用程序中有一系列标签-

    Label[] labels = new Label[8];      

我想按顺序改变循环中那些的背景颜色-

    private void btnPrepare_Click(object sender, EventArgs e)
    {
        Application.DoEvents();
        for (int i = 0; i < 8; i++)
        {
           labels[i].BackColor = System.Drawing.Color.Red;
           System.Threading.Thread.Sleep(2000);
        }
    }

但是所有的变化都是一起出现的,而不是按顺序出现的。

有什么帮助吗?

最佳答案

这样说(快速修改):

private void btnPrepare_Click(object sender, EventArgs e) { 
  //DONE: foreach - no magic numbers (8)
  foreach (var lbl in labels) {
    lbl.BackColor = System.Drawing.Color.Red;
    lbl.Update(); // <- Update == force label repainting

    System.Threading.Thread.Sleep(2000);
  }
}

Application.DoEvents()邪恶的:它翻译所有事件,例如,关闭,当您只想绘画时。

更好的方法是使用Task而不是Thread:

// async: we're going to put await in the method
private async void btnPrepare_Click(object sender, EventArgs e) { 
  //DONE: foreach - no magic numbers (8)
  foreach (var lbl in labels) {
    lbl.BackColor = System.Drawing.Color.Red;

    // await: No need in force repainting, messages translating etc.
    await Task.Delay(2000);
  }
}

关于c# - 从 C# WinForm 应用程序中的循环更改标签背景色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662159/

相关文章:

C# - 为什么在引用类常量时执行流向实例变量?

c# - Windows 工作流基础中基于人工的任务

c# - 测量 RichTextBox 在一行中可以包含的字符数

c# - 从 for 循环更新进度条

c# - 具有条件连接和非匿名返回的 LINQ 查询

c# - 如何在 ASP.NET Core 3 预览版中使用 Lamar 2?

c# - try, catch 不起作用PresentationFramework.dll 中发生类型 'System.Windows.Markup.XamlParseException' 的未处理异常

c# - 从表单应用程序调用控制台应用程序的 `Main` 方法(通过按钮单击事件)

c# - C# 表单元素的动态命名

winforms - 将实体绑定(bind)到 Windows DataGridView