我有一个多行文本框,我在其中显示应用程序日志。如果长度>超过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秒;
它没有闪烁太多,但是如果将大量数据提交给日志,我需要一个解决方案,使文本框甚至可以全屏而不闪烁..谢谢!
答案 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来更新更新?