不断改变形状颜色
本文关键字:颜色 变形 改变 | 更新日期: 2023-09-27 17:50:41
我希望我的程序不断改变字体背景颜色,但我希望它顺利进行,所以我试图修改一个颜色变量Color custom;
,并使用它来为背景颜色的形式this.BackColor = custom;
,但它不工作,我不知道如何使它工作,这里是完整的代码:
private void Principal_Load(object sender, EventArgs e)
{
Color custom;
int contr = 0, contg = 0, contb = 0;
do
{
while (contr < 255 && contg == 0)
{
if (contb != 0)
{
contb--;
}
contr++;
while (contg < 255 && contb == 0)
{
if (contr != 0)
{
contr--;
}
contg++;
while (contb < 255 && contr == 0)
{
if (contg != 0)
{
contg--;
}
contb++;
}
}
}
custom = Color.FromArgb(contr, contg, contb);
this.BackColor = custom;
} while (true);
}
很简单你没有延迟。添加
Thread.Sleep(1000);
所有这些都必须在一个单独的线程上发生!否则你的UI会卡住
检查这个
首先,您当前的代码不能工作,但不是因为任何线程问题(尽管这确实需要解决)。
问题是这些行永远不会被击中:
custom = Color.FromArgb(contr, contg, contb);
this.BackColor = custom;
你的while
循环中的逻辑不工作。
生成的值是以下集合:
(0, 0, 1), (0, 0, 2) ... (0, 0, 255), (0, 254, 1), (0, 253, 2) ... (0, 1, 254)
然后它只是重复尝试产生这些值,但永远不能跳出while (contr < 255 && contg == 0)
循环。
现在,假设这就是你想要的,那么我建议最好的方法是使用微软的响应式框架。只要点击"Rx-WinForms",你就可以写下面的代码:
var ranges = new[]
{
Observable.Range(1, 255).Select(x => Color.FromArgb(0, 0, x)),
Observable.Range(1, 254).Select(x => Color.FromArgb(0, 255 - x, x)),
};
var query =
ranges
.Concat()
.Zip(Observable.Interval(TimeSpan.FromMilliseconds(100.0)), (x, i) => x)
.Repeat()
.ObserveOn(this);
var subscription = query.Subscribe(c => this.BackColor = c);
所以ranges
是IObservable<Color>
的数组。在ranges
上调用.Concat()
将其从IObservable<Color>[]
变为IObservable<Color>
。.Zip
将每个值绑定到一个以10ms为增量计数的计时器(如果您愿意,可以更改该值)。调用.Repeat()
只是不断地重复这个循环——有点像while (true)
。然后.ObserveOn(this)
强制可观察对象订阅在UI线程上运行。
最后,.Subscribe(...)
实际运行可观察对象并更新表单的BackColor
。
.Dispose()
来停止订阅:
subscription.Dispose();
清理所有线程和计时器。这是一个非常简洁的解决方案。