Stoppen TextBox flackert beim update
Meiner WinForms-Anwendung hat eine TextBox, die ich als log-Datei. Ich bin mit dem anfügen von text, ohne die form zu flackern mit TextBox.AppendText(string);
, aber wenn ich versuche zu reinigen, die alten Texte (wie die der kontrollperson .Text-Eigenschaft erreicht .MaxLength-Grenzwert), bekomme ich furchtbare flimmern.
Den code, den ich verwende ist wie folgt:
public static void AddTextToConsoleThreadSafe(TextBox textBox, string text)
{
if (textBox.InvokeRequired)
{
textBox.Invoke(new AddTextToConsoleThreadSafeDelegate(AddTextToConsoleThreadSafe), new object[] { textBox, text });
}
else
{
//Ensure that text is purged from the top of the textbox
//if the amount of text in the box is approaching the
//MaxLength property of the control
if (textBox.Text.Length + text.Length > textBox.MaxLength)
{
int cr = textBox.Text.IndexOf("\r\n");
if (cr > 0)
{
textBox.Select(0, cr + 1);
textBox.SelectedText = string.Empty;
}
else
{
textBox.Select(0, text.Length);
}
}
//Append the new text, move the caret to the end of the
//text, and ensure the textbox is scrolled to the bottom
textBox.AppendText(text);
textBox.SelectionStart = textBox.Text.Length;
textBox.ScrollToCaret();
}
}
Ist es ein ordentlicher Weg, der Spülung Zeilen text von der Spitze der Kontrolle, dass nicht ein flackern verursachen? Eine textbox hat nicht die BeginUpdate()/EndUpdate () - Methoden, die eine ListView hat.
Ist ein TextBox-Steuerelement auch den am besten geeignet, die Steuerung für einen Konsolen-log?
Edit: Die TextBox flackert erscheint die textbox scrollen bis zu der Spitze (während ich Spülen Sie den text oben auf der Steuerung) und dann sofort scrollt wieder nach unten auf den Boden. - es geschieht alles sehr schnell, so dass ich nur wiederholt flackern.
Hab ich auch gerade gesehen diese Frage, und der Vorschlag war, verwenden Sie eine ListBox, allerdings weiß ich nicht, ob dies funktionieren wird in meiner situation (in den meisten Fällen) ich erhalte den text für die ListBox ein Zeichen zu einem Zeitpunkt.
- Vielleicht wollen das ändern ", wenn" in "während" - im Falle das löschen der ersten Zeile der text ist nicht genug, um den neuen text zu passen die TextBox.
- Gut erkannt Noam. Danke.
- Dieser Beitrag hat einige weitere Informationen zu diesem Thema - stackoverflow.com/questions/1333393/...
- In der Tat hat es eine sehr klare Lösung, dass doppelte Pufferung gilt nicht für Textfelder so sollte man es manuell machen...
- Vinko, postet bitte den obigen Kommentar als eine Antwort, so kann ich es akzeptieren.
- VERWENDEN Sie EINFACH RichTextBox statt. ES IST FLACKERFREI. Set DetectUrls-und ShortcutsEnabled-Eigenschaft auf FALSE für mehr Kompatibilität mit TextBox ' es. Es funktioniert wirklich Super.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie das hinzufügen (und entfernen) ein Zeichen in einer Zeit, mehrmals und schnell. Eine Lösung wäre die Puffer werden die Zeichen, wie Sie hinzu und aktualisieren Sie das Textfeld, in größeren Zeitintervallen (unabhängig von der Anzahl der Zeichen), zum Beispiel, alle 250 Millisekunden.
Dies würde erfordern:
Andere Möglichkeit ist die Verwendung sowohl alle 250 ms und 100 Zeichen, was auch immer zuerst Eintritt. Aber dies würde wahrscheinlich erschweren den code mehr ohne greifbaren nutzen.
Mathijs Antwort funktioniert bei mir. Ich habe es geändert etwas, so kann ich die Verwendung mit control - a control-Erweiterung:
So alle Sie tun müssen, ist:
Gut funktioniert. Alle flackern aufhört.
// do something here.
ist ein resize-Ereignis.Fand ich eine Lösung im internet zu suchen:
Haben Sie doppelte Pufferung auf Ihrem Haupt-Fenster?
dieser code in den Konstruktor nach dem InitializeComponent-Aufruf hinzufügen wird die doppelte Pufferung und möglicherweise reduzieren Sie flackern.
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
Haben Sie versucht, SuspendLayout() /ResumeLayout (), um alle Ihre update-Operationen?
Könnte man auch rufen Sie Clear() auf das Textfeld weisen Sie den text abgeschnitten.
Wenn Ihr versuchen zu implementieren eine Art von log-Datei-viewer, könnte man eine ListBox statt.
Ich finde, dass mit SelectedText = text reduzieren das flimmern erheblich. Für sehr schnelle updates, das flackern wird lokalisiert, und der neue text nur, und Sie werden nicht seltsame Verhalten aus der Bildlaufleiste springen herum.
Können Sie auch diese zu überschreiben text zuvor geschrieben -- als müssten Sie für die Aktualisierung eines counter-oder download-Prozentsatz zum Beispiel:
Andere als das, es scheint nicht, eine einfache Methode zur Reduzierung von flimmern in der .NET TextBox.