Mi aplicación WinForms tiene un TextBox que estoy usando como archivo de registro. Estoy añadiendo texto sin que el formulario parpadee usando TextBox.AppendText(string);
, sin embargo, cuando intento purgar el texto anterior (dado que la propiedad .Text del control alcanza el límite .MaxLength), aparece un parpadeo horrible.Detener el parpadeo de TextBox durante la actualización
El código que estoy usando es el siguiente:
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();
}
}
¿Hay una manera más ordenada de purgar las líneas de texto de la parte superior del control que no causa parpadeo? Un cuadro de texto no tiene los métodos BeginUpdate()/EndUpdate() que tiene un ListView.
¿Es un control TextBox incluso el control más adecuado para un registro de consola?
Editar: El parpadeo del cuadro de texto parece ser el cuadro de texto que se desplaza hacia arriba (mientras purgo el texto en la parte superior del control), y luego se desplaza de inmediato hacia abajo. - Todo sucede muy rápido, así que solo veo parpadeos repetidos.
También he visto this question, y la sugerencia era usar un ListBox, sin embargo, no sé si esto funcionará en mi situación, ya que (en la mayoría de los casos) estoy recibiendo el texto para el ListBox un personaje a la vez.
Podría querer cambiar ese "si" por "while" - en caso de que eliminar la primera línea de texto no sea suficiente para permitir que el nuevo texto encaje en el TextBox. –
Bien manchado Noam. Gracias. – Bryan
Este post tiene algo más de información sobre esto - http://stackoverflow.com/questions/1333393/how-to-prevent-a-windows-forms-textbox-from-flickering-on-resize –