1

アプリのログを表示する複数行のテキストボックスがあります。長さが1,000文字を超える場合は、ログをサブストレートします。問題は、ちらつきがあることです。データが異なる場合は、タイマーコントロールを使用してテキストボックスを条件付きで更新します。

これを回避する方法はありますか?またはログを表示するためのより良い方法はありますか?ありがとう!

// this is inside timer
if(txt_log.Text != MY_LOG_VAR){
   txt_log.Text = MY_LOG_VAR;
}

// function to update log
public void Log(string data){

  MY_LOG_VAR = data + "\r\n" + MY_LOG_VAR;

  if(MY_LOG_VAR.Length > 1000){
     substr...
  }
} 

Log関数は1秒間に20回も呼び出すことができ、タイマー間隔は100秒に設定されています。

ちらつきはあまりありませんが、ログに大量のデータが送信される場合は、テキストボックスを全画面表示にしてちらつきを起こさないようにするソリューションが必要です。ありがとうございます。

4

3 に答える 3

2

TextBoxのペイント方法についてできることは何もありません。WM_PAINTを使用せずにペイントするなど、いくつかの罪を犯します。これは、厳しく制限されたハードウェアで実行する必要があった1985年に非常に重要でした。1K文字はかなりローエンドであり、64Kはちらつきを減らすための優れたラウンド数です。また、その間に必ずAppendTextを使用してください。

それを超えて、代わりにRichTextBoxを検討してください。これはダブルバッファリングであり、テキストを読み取り専用にするためのより良い方法があります。

于 2012-08-16T13:26:14.397 に答える
1

テキストボックスのコンテンツ全体を置き換えるのではなく、TextBox.AppendTextを使用するようにしてください。

// function to update log 
public void Log(string data)
{ 
  textBox1.AppendText(data + "\r\n");
  MY_LOG_VAR = data + "\r\n" + MY_LOG_VAR; 

}  

これは、前のテキストの前に新しいテキストを配置することと同じではありませんが、ちらつきを止める必要があると思います。私はRichTextBoxでいくつかのテストを行いましたが、ちらつきはまったくありません(Hans Passantがその回答で言ったとおりです)...

たとえば、ちらつきのないスクロール

 richTextBox1.AppendText(data +"\n");
 richTextBox1.SelectionStart = richTextBox1.GetFirstCharIndexFromLine(richTextBox1.Lines.Count()-1);
 richTextBox1.ScrollToCaret();
于 2012-08-16T13:21:21.340 に答える
0

テキストボックスのBeginUpdate/EndUpdateの呼び出しで更新を囲んでみましたか?

于 2012-08-16T13:27:54.020 に答える