Das TextBox-Flimmern während des Updates anhalten

7

Meine WinForms-Anwendung hat eine TextBox, die ich als Protokolldatei verwende. Ich füge Text ohne das Flackern des Formulars mit TextBox.AppendText(string); an, aber wenn ich versuche, alten Text zu löschen (da die Eigenschaft .Text des Steuerelements die MaxLength-Grenze erreicht), bekomme ich ein schreckliches Flimmern.

Der Code, den ich verwende, ist wie folgt:

%Vor%

Gibt es eine bessere Möglichkeit, Textzeilen oberhalb des Steuerelements zu löschen, die kein Flimmern verursachen? Ein Textfeld hat nicht die BeginUpdate () / EndUpdate () -Methoden, die ein ListView hat.

Ist ein TextBox-Steuerelement selbst das am besten geeignete Steuerelement für ein Konsolenprotokoll?

Bearbeiten: Das Flackern der TextBox scheint das Textfeld zu sein, das nach oben scrollt (während ich den Text oben auf dem Steuerelement lösche), und dann scrollt es sofort zurück nach unten. - es passiert alles sehr schnell, also sehe ich immer wieder flackern.

Ich habe auch gerade diese Frage , und der Vorschlag war, eine ListBox zu verwenden, aber ich weiß nicht, ob das in meiner Situation funktionieren wird, da ich (in den meisten Fällen) den Text für die ListBox jeweils ein Zeichen gleichzeitig erhalte.

    
Bryan 11.10.2009, 09:47
quelle

6 Antworten

2

Das Problem ist, dass Sie immer wieder ein Zeichen gleichzeitig hinzufügen und entfernen. Eine Lösung wäre, die Zeichen beim Hinzufügen zu puffern und das Textfeld in größeren Intervallen zu aktualisieren (unabhängig von der Anzahl der Zeichen), z. B. alle 250 Millisekunden.

Dies würde erfordern:

  • um ein Array oder einen Stapel von Zeichen zu haben, wo sie hinzugefügt werden
  • Einen Timer zu haben, der einen Delegaten aufruft, der die Aktualisierung tatsächlich mit den im Stack gespeicherten Zeichen vornimmt

Eine andere Möglichkeit ist, alle 250 ms und 100 Zeichen zu verwenden, was immer zuerst passiert. Aber das würde den Code wahrscheinlich komplizierter machen, ohne greifbaren Nutzen zu haben.

    
Vinko Vrsalovic 11.10.2009, 10:29
quelle
10

Ich habe im Internet eine Lösung gefunden:

%Vor%     
Mathijs Beentjes 02.02.2012 14:55
quelle
9

Mathijs Antwort funktioniert für mich. Ich habe es leicht modifiziert, so dass ich mit jedem Steuerelement verwenden kann - eine Steuerelementerweiterung:

%Vor%

Alles, was Sie tun müssen, ist:

%Vor%

Funktioniert gut. Alles Flackern hört auf.

    
mkaj 28.07.2013 22:23
quelle
3

Haben Sie Double-Buffering in Ihrem Hauptfenster eingestellt?

Dieser Code in Ihrem Konstruktor nach dem Aufruf von InitializeComponent fügt eine doppelte Pufferung hinzu und reduziert möglicherweise das Flimmern.

this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);

    
Alastair Pitts 11.10.2009 10:03
quelle
2

Haben Sie SuspendLayout () / ResumeLayout () um all Ihre Aktualisierungsvorgänge herum versucht?

Sie könnten Clear () auch in der Textbox aufrufen und dann den abgeschnittenen Text neu zuweisen.

Wenn Sie versuchen, eine Art von Protokolldatei-Viewer zu implementieren, können Sie stattdessen eine ListBox verwenden.

    
codymanix 11.10.2009 10:07
quelle
1

Ich finde, dass die Verwendung von SelectedText = text das Flimmern drastisch reduziert. Für sehr schnelle Updates wird das Flimmern nur auf den neuen Text lokalisiert und Sie werden kein merkwürdiges Verhalten von der Bildlaufleiste bekommen, wenn Sie herumspringen.

%Vor%

Sie können damit auch zuvor geschriebenen Text überschreiben - wie Sie beispielsweise einen Zähler oder Download-Prozentsatz aktualisieren müssten:

%Vor%

Darüber hinaus scheint es keine einfache Methode zu geben, das Flimmern in der .NET TextBox zu reduzieren.

    
Eric 02.11.2011 17:52
quelle

Tags und Links