如何使按钮遍历所有背景颜色

时间:2013-11-03 14:47:13

标签: c# loops colors

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

问候,

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

3 个答案:

答案 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);
    }
}