首页 > 解决方案 > 快速随机更改表单背景颜色

问题描述

我正在尝试编写一些代码来快速将表单的背景更改为随机 RGB 颜色,但该程序似乎可能会停止,直到循环完成然后它会更改一次颜色。

    private void button1_Click(object sender, EventArgs e)
    {
        Random rnd = new Random();
        int num1 = rnd.Next(0, 255);
        int num2 = rnd.Next(0, 255);
        int num3 = rnd.Next(0, 255);
        int i;
        for(i = 0; i < 100; i++)
        {
            this.BackColor = Color.FromArgb(num1, num2, num3);
            Thread.Sleep(50);
        }
}

我错过了哪一部分,或者我用错了什么?
谢谢

标签: c#

解决方案


您需要更改循环中的值,否则将始终相同。此外,在更改其背景颜色后刷新您的组件。

private void button1_Click(object sender, EventArgs e)
{
    Random rnd = new Random();
    int num1;
    int num2;
    int num3;
    for (int i = 0; i < 100; i++)
    {
        num1 = rnd.Next(0, 255);
        num2 = rnd.Next(0, 255);
        num3 = rnd.Next(0, 255);
        this.BackColor = Color.FromArgb(num1, num2, num3);
        this.Refresh();
        Thread.Sleep(50);
    }
}

但是,正如 Patrick Hofman 所指出的,您的 UI 线程将被锁定在此循环中,并且您的表单看起来会冻结。

解决这个问题的第一种方法是调用

Application.DoEvents();

代替Refresh()

但这不是最好的解决方案。

好的解决方案是将循环放在另一个线程中:

private void button1_Click(object sender, EventArgs e)
{
    ThreadStart ts = new ThreadStart(ChangeBackColor);
    Thread T = new Thread(ts);
    T.Start();
}

private void ChangeBackColor()
{
    Random rnd = new Random();
    int num1;
    int num2;
    int num3;
    for (int i = 0; i < 100; i++)
    {
        num1 = rnd.Next(0, 255);
        num2 = rnd.Next(0, 255);
        num3 = rnd.Next(0, 255);
        this.Invoke(new Action(() => this.BackColor = Color.FromArgb(num1, num2, num3));
        Thread.Sleep(50);
    }
}

推荐阅读