foreach (Color b in new ColorConverter().GetStandardValues())
{
button1.BackColor = b;
Thread.Sleep(200);
}
问候,
有人可以解释一下,为什么这不能使我的按钮的背景颜色闪烁所有已知颜色,而只是改为最后一行(黄绿色)。我希望它能够经历所有颜色。
答案 0 :(得分:1)
您在该循环的整个持续时间内阻止了UI线程,这可以防止执行任何其他UI操作(例如重新绘制该按钮)。
你可以做的是使代码异步,这样你就可以设置颜色,然后在一段时间内根本不做任何事情,并让UI线程在此期间自由地做任何想做的事情。与使用await
关键字的旧版本相比,C#5.0使 更容易
private async void button1_Click(object sender, EventArgs args)
{
foreach (Color b in new ColorConverter().GetStandardValues())
{
button1.BackColor = b;
await Task.Delay(200);
}
}
答案 1 :(得分:0)
根据对已接受答案的评论进行线程安全的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;
}
}
答案 2 :(得分:-1)
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);
}
}