我的应用程序中有一系列标签-
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/