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

UIスレッドでbtnClickが実行されているため、フリーズしています。下の図のようにWPFアニメーションを使用するか、または非同期を使用するか、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); 
    }  
} 

注意現在のコンテキストをキャプチャし、遅延を実行し、次にコンテキストを再開するのにかかる時間が、小さな遅延(1ms20ms)に対して同じ時間(約20ms)を要する可能性があります。したがって、遅延の違いに気付くには、遅延を少し増やす必要があります。

+0

反復ごとに1000ミリ秒待機するのは255秒かかると私はOPはそれではないと思う。 –

+0

カウンタが255で固定されていることに気付かなかった。 – user3185569

+0

これはうまくいきますが、DoEventsと同じ問題があります。コードリエントリー。ループを実行している間にもう一度ボタンをクリックすると、ループが再び開始されます(そしてdo-do stuffがない場合は小さな問題になります)。 – Steve

関連する問題