私のWinFormsアプリケーションには、ログファイルとして使用しているTextBoxがあります。私はTextBox.AppendText(string);
を使用してフォームを点滅させずにテキストを追加していますが、(コントロールの.Textプロパティが.MaxLengthの制限に達すると)古いテキストを消去しようとすると、ひどいちらつきが発生します。次のように更新中にTextBoxフリッカーを停止する
私が使用しているコードは次のとおりです。
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();
}
}
はちらつきが発生しないコントロールの上部からテキストの行をパージする滑らかな印象方法はありますか?テキストボックスには、ListViewにはBeginUpdate()/ EndUpdate()メソッドがありません。
TextBoxコントロールはコンソールログに最適なコントロールですか?
編集:TextBoxのちらつきは、コントロールの上部にあるテキストをパージしている間に、テキストボックスがスクロールしているように見えますが、すぐにスクロールして下部にスクロールします。 - それはすべて非常に迅速に起こるので、私はちょうど繰り返し点滅を参照してください。
また、私はちょうどthis questionを見てきましたが、提案はListBoxを使用することでしたが、(ほとんどの場合)ListBoxのテキストを受け取っているので、一度に1文字。
"if"を "while"に変更したい場合があります。新しいテキストをTextBoxに収めるにはテキストの最初の行を削除するだけでは不十分です。 –
いいえ、よく見られるノアム。ありがとう。 – Bryan
この投稿はこれに関するさらに詳しい情報があります - http://stackoverflow.com/questions/1333393/how-to-prevent-a-windows-forms-textbox-from-flickering-on-resize –