2016-07-23 14 views
0

Ich versuche, die Farbe eines Textfelds grün zu ändern, und dann zurück zu weiß als eine Methode der Bestätigung. Hier ist der Code, den ich bisher habe:Fading Farbe in einer Schleife mit 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); 
    }  
} 

Es funktioniert nicht. Es scheint nur auf die 2,5 Sekunden zu warten, bevor ich etwas anderes machen kann, aber die Farbe bleibt die ganze Zeit weiß.

+1

btnClick wird auf dem UI-Thread ausgeführt und daher wird ein Einfrieren angezeigt. Sie können stattdessen WPF-Animation oder async verwenden, wie in der folgenden Abbildung gezeigt, oder diesen Code in einer Hintergrundaufgabe ausführen, die die BackColor mithilfe von Dispatcher.BeginInvoke aktualisiert –

+0

In welchem ​​Kontext wird dies verwendet? Haben Sie darüber nachgedacht, CSS oder LESS für diese Aufgabe zu verwenden? –

Antwort

3

Thread.Sleep Blöcke UI-Thread (Bei Verwendung der UI-Thread wie Ihr Fall ausgeführt), haben Sie Task.Delay() zu verwenden und Ihre Methode async machen die Benutzeroberfläche reagiert, und sehen Sie die Fading-Animation zu machen:

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); 
    }  
} 

Hinweis dass die für die Erfassung des aktuellen Kontexts benötigte Zeit, die Ausführung der Verzögerung und die anschließende Fortsetzung des Kontexts für kleine Verzögerungen (1ms vs 20ms) dieselbe Zeit benötigen (um 20ms). Daher müssen Sie die Verzögerung möglicherweise etwas erhöhen, um einen Unterschied zwischen den verschiedenen Verzögerungen zu erkennen.

+0

1000 Millisekunden Warten pro Iteration dauert 255 Sekunden, ich denke OP ist nicht dafür. –

+0

Habe nicht bemerkt, dass der Zähler 255 war, behoben. – user3185569

+0

Nun, es funktioniert, aber das hat das gleiche Problem von DoEvents. Code-Wiedereintritt Wenn Sie erneut auf die Schaltfläche klicken, während Sie die Schleife ausführen, startet die Schleife erneut (und dies wird ein kleines Problem sein, wenn es keine - Kommentar - tun) – Steve