2016-07-23 102 views
0

我试图使文本框的颜色更改为绿色,然后作为确认方法淡化为白色。这是我迄今的代码:褪色与C循环中的颜色#

private void btnCommit_Click(object sender, EventArgs e) 
{ 
    //do stuff 

    Color c = new Color(); 
    for (int i = 0; i <= 255; i++) 
    { 
     c = Color.FromArgb(i, 255, i); 
     textBox1.BackColor = c; 

     System.Threading.Thread.Sleep(10); 
    }  
} 

它不起作用。它似乎只是等待2.5秒才能做其他事情,但颜色始终保持白色。

+1

btnClick在UI线程上执行,因此你看到冻结。您可以使用WPF动画代替或异步(如下面的anwer中所示),或者在后台任务中使用Dispatcher.BeginInvoke更新BackColor来运行此代码。 –

+0

在哪个上下文中使用?你有没有考虑过使用CSS或LESS来完成这项任务? –

回答

3

Thread.Sleep块的UI线程(如果使用像你的情况下,UI线程中执行),你必须使用Task.Delay(),让你的方法async使UI响应,看看褪色动画:

private async void btnCommit_Click(object sender, EventArgs e) 
{ 
    //do stuff 

    Color c = new Color(); 
    for (int i = 0; i <= 255; i++) 
    { 
     c = Color.FromArgb(i, 255, i); 
     textBox1.BackColor = c; 

     await Task.Delay(10); 
    }  
} 

注捕获当前上下文所需的时间,执行延迟,然后恢复上下文可能需要相同的时间(大约20ms)用于小延迟(1ms20ms)。因此,您可能需要稍微增加延迟以注意不同延迟之间的差异。

+0

每次迭代等待1000毫秒需要255秒,我认为OP没有出现这种情况。 –

+0

没有注意到计数器是255,是固定的。 – user3185569

+0

嗯,它的工作原理,但这有DoEvents相同的问题。代码重入。如果您在执行循环时再次点击按钮,则循环会再次启动(如果没有 - 执行某些操作,这将会是一个小问题 - 评论) – Steve