【问题标题】:C# textbox stop flickeringC#文本框停止闪烁
【发布时间】:2012-08-16 21:35:24
【问题描述】:

我有一个显示应用程序日志的多行文本框。如果长度大于 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秒;

它不会闪烁太多,但是如果将大量数据提交到它的日志中,我需要一个解决方案,让文本框甚至全屏而不闪烁。谢谢!

【问题讨论】:

  • 请显示更新文本框的代码
  • 你每次都设置text属性吗?
  • 您是否在每次用户输入内容时都进行 > 1000 检查?如果是这样,您正在处理什么事件?我怀疑它是错误的......而且这种情况下的计时器听起来不正确。
  • 更新了代码。它只是用来调试应用程序,它是一个网络应用程序,所以它显示了它在做什么。
  • 您可以尝试在更新前调用SuspendLayout 并在更新后调用ResumeLayout 看看是否会停止闪烁。但是我怀疑当您每100 毫秒更新一次文本框时它会有所帮助。跨度>

标签: c# textbox


【解决方案1】:

对于 TextBox 的绘制方式,您无能为力。它犯了一些错误,比如没有 WM_PAINT 的绘画,这在 1985 年非常重要,当时它必须在严重受限的硬件上运行。 1K 字符相当低端,64K 是一个不错的整数,可以减少闪烁。并确保在两者之间使用 AppendText。

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

【讨论】:

    【解决方案2】:

    您应该尝试使用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 做了一些测试,根本没有闪烁 (正如汉斯·帕桑特在回答中所说的那样)......

    例如滚动不闪烁

     richTextBox1.AppendText(data +"\n");
     richTextBox1.SelectionStart = richTextBox1.GetFirstCharIndexFromLine(richTextBox1.Lines.Count()-1);
     richTextBox1.ScrollToCaret();
    

    【讨论】:

      【解决方案3】:

      您是否尝试过在文本框上调用 BeginUpdate/EndUpdate 来围绕您的更新?

      【讨论】:

      • 那不存在。
      猜你喜欢
      • 2010-12-05
      • 2010-12-29
      • 2014-01-06
      • 2011-12-24
      • 1970-01-01
      • 2010-10-10
      • 2012-11-18
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多