2016-07-23 105 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