1

我有一个显示应用程序日志的多行文本框。如果长度大于 1k 个字符,我会删除日志。问题是它在闪烁。如果数据不同,我使用计时器控件来更新带有条件的文本框。

有什么办法吗?还是有更好的方法来显示日志?谢谢!

// 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函数甚至可以每秒调用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 回答