c# - 快速随机更改表单背景颜色
问题描述
我正在尝试编写一些代码来快速将表单的背景更改为随机 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);
}
}
我错过了哪一部分,或者我用错了什么?
谢谢
解决方案
您需要更改循环中的值,否则将始终相同。此外,在更改其背景颜色后刷新您的组件。
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);
}
}
推荐阅读
- sublimetext3 - 命令插件的崇高文本链无法正常工作
- applescript - Applescript 保存文件菜单:如何将目标指向桌面?
- flutter - C++ 在 Flutter 中调用 Dart 函数
- java - drawLine 不显示
- automated-tests - 如何防止在邮递员测试中生成新的测试脚本 ID
- c# - CreatedAtRoute 与 Api 版本控制
- visual-c++ - Visual Studio 2017 中的 Unreal Engine 4.22 C++ 代码建议
- angular - 为什么自定义管道给出错误:'EllipsisPipe' 类型中的属性'transform' 不可分配给基本类型'SlicePipe' 中的相同属性
- sharepoint - Ms Graph API Onedrive 副本返回 generalException
- php - Laravel - 过滤器不起作用的引导数据表