В моем приложении WinForms есть TextBox, который я использую в качестве файла журнала. Я добавляю текст без мерцания формы, используя TextBox.AppendText(string);
, однако, когда я пытаюсь удалить старый текст (поскольку свойство элемента управления .Text достигает предела .MaxLength), я получаю ужасное мерцание.
Код, который я использую, выглядит следующим образом:
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();
}
}
Есть ли более аккуратный способ очистки строк текста сверху элемента управления, который не вызывает мерцания? У текстового поля нет методов BeginUpdate () / EndUpdate (), которые есть у ListView.
Является ли элемент управления TextBox лучшим элементом управления для журнала консоли?
Редактировать: Мерцание TextBox выглядит как текстовое поле, прокручиваемое вверх (пока я очищаю текст в верхней части элемента управления), а затем сразу же прокручивается обратно вниз. - все это происходит очень быстро, поэтому я просто вижу повторяющиеся мерцания.
Я также только что видел этот вопрос , и было предложено использовать ListBox, однако я не знаю, будет ли это работать в моей ситуации, так как (в большинстве случаев) я получение текста для ListBox по одному символу за раз.