0
foreach (Color b in new ColorConverter().GetStandardValues())
{
    button1.BackColor = b;
    Thread.Sleep(200);
}

问候,

有人可以解释一下,为什么这不会使我的按钮的背景颜色闪烁所有已知颜色,而只是更改为最后一行(黄绿色)。我希望它通过所有的颜色。

4

3 回答 3

1

您在该循环的整个持续时间内阻塞了 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);
    }
}
于 2013-11-04T19:36:16.053 回答
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;
    }
}
于 2013-11-04T19:28:58.093 回答
-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);
    }
}
于 2013-11-03T14:51:08.627 回答