foreach (Color b in new ColorConverter().GetStandardValues())
{
button1.BackColor = b;
Thread.Sleep(200);
}
问候,
有人可以解释一下,为什么这不会使我的按钮的背景颜色闪烁所有已知颜色,而只是更改为最后一行(黄绿色)。我希望它通过所有的颜色。
您在该循环的整个持续时间内阻塞了 UI 线程,这会阻止执行任何其他 UI 操作(例如重新绘制该按钮)。
你可以做的是使代码异步,这样你设置颜色,然后在一段时间内不做任何事情,同时让 UI 线程自由地做它想做的任何事情。C# 5.0使用关键字比旧版本更容易做到这一点:await
private async void button1_Click(object sender, EventArgs args)
{
foreach (Color b in new ColorConverter().GetStandardValues())
{
button1.BackColor = b;
await Task.Delay(200);
}
}
根据已接受答案的评论更新线程安全的 UI:
private void button2_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(new ThreadStart(setColours));
t1.IsBackground = true;
t1.Start();
}
private void setColours()
{
foreach (Color b in new ColorConverter().GetStandardValues())
{
setColor(b);
Thread.Sleep(200);
}
}
delegate void setColorDelegate(Color b);
private void setColor(Color b)
{
if (IsDisposed)
{
return;
}
if (InvokeRequired)
{
Invoke(new setColorDelegate(setColor), b);
}
else
{
button1.BackColor = b;
}
}
private void button2_Click(object sender, EventArgs e)
{
Thread t1=new Thread(new ThreadStart(setColours));
t1.Start();
}
private void setColours()
{
foreach (Color b in new ColorConverter().GetStandardValues())
{
button1.BackColor = b;
Thread.Sleep(200);
}
}