Moja aplikacja WinForm ma element TextBox, którego używam jako pliku dziennika. Załączam tekst bez migotania formularzy przy użyciu TextBox.AppendText(string);
, jednak gdy próbuję usunąć stary tekst (gdy właściwość .Text formantu osiągnie limit .MaxLength), dostaję okropnego migotania.Zatrzymywanie migotania pola tekstowego podczas aktualizacji
Kod używam jest następująco:
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();
}
}
Czy istnieje neater sposobem oczyszczenia linii tekstu od góry kontrolą, która nie powoduje migotanie? Pole tekstowe nie ma metod BeginUpdate()/EndUpdate(), które ma ListView.
Czy kontrolka TextBox jest nawet najlepiej dopasowanym kontrolerem dla dziennika konsoli?
Edytuj: Migotanie pola TextBox wydaje się być tekstem przewijającym się do góry (podczas gdy usuwam tekst u góry kontrolki), a następnie natychmiast przewija z powrotem na dół. - wszystko dzieje się bardzo szybko, więc widzę powtarzające się migotanie.
Właśnie widziałem także this question, a propozycja polegała na użyciu ListBox, jednak nie wiem, czy to zadziała w mojej sytuacji, ponieważ (w większości przypadków) otrzymuję tekst do ListBoxa jedna postać na raz.
Może chcieć zmienić to "if" na "while" - w przypadku, gdy usunięcie pierwszego wiersza tekstu nie wystarczy, aby nowy tekst pasował do TextBox. –
Dobrze zauważony Noam. Dzięki. – Bryan
Ten post zawiera więcej informacji na ten temat - http://stackoverflow.com/questions/1333393/how-to-prevent-a-windows-forms-textbox-from-flickering-on-resize –