不断更改表格颜色

时间:2015-05-25 05:58:52

标签: c# forms winforms colors

我希望我的程序不断更改字体背景颜色,但我希望它顺利进行,所以我尝试修改颜色变量Color custom;并将其用于表单{{1}的背景颜色但它不起作用,我不知道如何使它工作,这是完整的代码:

this.BackColor = custom;

2 个答案:

答案 0 :(得分:5)

很简单,你没有延迟。由于此Link添加

Thread.Sleep(1000);

所有这些都发生在一个单独的线程上! 或者你的用户界面将被卡住

Check This

答案 1 :(得分:1)

首先,您当前的代码不起作用,但不是因为任何线程问题(尽管确实需要解决)。

问题是这些线永远不会被击中:

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)循环。

现在,假设这实际上是您想要的,那么我建议最好的方法是使用Microsoft的Reactive Framework。只需NugGet“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);

所以rangesIObservable<Color>的数组。在.Concat()上拨打ranges会将其从IObservable<Color>[]转为IObservable<Color>.Zip将每个值绑定到以10ms为增量计数的计时器(如果需要,可以更改该值)。调用.Repeat()只是连续重复循环 - 有点像while (true)。然后.ObserveOn(this)强制可观察的订阅在UI线程上运行。

最后,.Subscribe(...)实际运行了observable并更新了表单的BackColor

关于这一点的好处是您可以通过在订阅上调用.Dispose()来随时停止订阅:

subscription.Dispose();

清理所有线程和计时器。这是一个非常巧妙的解决方案。