C#文本框停止闪烁

时间:2012-08-16 13:03:11

标签: c# textbox

我有一个多行文本框,我在其中显示应用程序日志。如果长度>超过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秒;

它没有闪烁太多,但是如果将大量数据提交给日志,我需要一个解决方案,使文本框甚至可以全屏而不闪烁..谢谢!

3 个答案:

答案 0 :(得分:2)

对于TextBox绘制的方式,您无法做任何事情。它承担了一些罪恶,比如没有WM_PAINT的绘画,这在1985年必须在严格受限的硬件上运行时非常重要。 1K字符相当低端,64K是一个很好的圆形数字,可以减少闪烁。并确保在其间使用AppendText。

除此之外,请考虑使用RichTextBox。它是双缓冲区,并且有更好的方法使文本成为只读。

答案 1 :(得分: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();

答案 2 :(得分:0)

您是否尝试过在文本框中调用BeginUpdate / EndUpdate来更新更新?