2012-10-14 160 views
3

我有这样的功能:如何避免richTextBox.Clear();闪光/闪烁?

private void clearRichtextBox() 
{ 
    richTextBox2.Clear(); 
    foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords) 
    { 
     for (int i = 0; i < kvp.Value.Count(); i++) 
     { 
      richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine); 
     } 
    } 
} 

如果它做它看起来像RichTextBox的闪烁/闪光milisecond左右Clear();。任何方式来避免停止它?

+0

闪烁或闪烁与“绘画”事件有关,如果您反复清除,这是不可避免的!你真的需要每次清除所有内容?! – moorara

+0

Milad在每次单击确定时清除它。它不是自动的。如果还有另一种方法可以清除/删除richTextBox中的所有文本,而不使用Clear()我正在使用它。有没有其他方法? – user1741587

回答

2

不能避免RichTextBox的内在行为排队至少一个重绘时段,您所提供的文字变化,但在代码中,你可以设置编写文本带外而不是打电话清楚。这会将视觉活动变化的数量减少到最小,而不必改变它的正常操作。另外,它看起来像是希望保持内容与您的KeyValue集合的视图相同。

使用StringBuilder在将文本应用到RichTextBox之前组装您的文本,然后在存在差异时指定Text属性。如果RichTextBox的内容没有变化,则不会重新绘制所有内容,这是您看到的闪烁行为的来源。

private void clearRichtextBox() 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords) 
    { 
     for (int i = 0; i < kvp.Value.Count(); i++) 
     { 
      sb.AppendFormat("Url: {0} --- Localy KeyWord: {1}{2}", kvp.Key,kvp.Value[i],Environment.NewLine); 
     } 
    } 

    string viewString = sb.ToString(); 
    if(viewString != richTextBox2.Text) 
    { 
     richTextBox2.Text = viewString; 
    } 
} 
+0

好吧。你的解决方案肯定比我的更正确。所以,+1 –

+1

meklarian伟大的工作,我只是添加了失踪的“---”AppendFormat和它的工作很好。 – user1741587

+0

哎呦,没错。修复。 – meklarian

1

它只是如何工作。您可以尝试到您的表单上启用双缓冲:

this.DoubleBuffered = true; 

另一种方式是继承RichTextBox控件,并使用SetStyle(),使双缓冲的控制,其自身超越其新()方法。

如何将它与这个方法:

public class MyRichTextBox : RichTextBox { 

    protected override void New() { 
     base.New(); 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    } 
} 

然后你需要做以下步骤:

  1. 关闭设计窗口
  2. 打开设计文件
  3. 您将需要用MyRichTextBox替换RichTextBox两次,其中一个接近文件顶部重新声明它,并且一个接近它初始化的底部。
  4. 保存并重新打开的设计/测试
+0

Abdias尝试了DoubleBuffered = true;在构造函数中它没有帮助。你能告诉我怎么用New()SetStyle()来为控件启用DoubleBuffering吗? – user1741587

+0

@ user1741587我更新了我的答案。看看是否适合你。 – K3N

0

我还没有试过看它是否也闪烁,但你可以设置RTB的值为空字符串。

richTextBox2.Text = ""; 
foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords) 
{ 
    for (int i = 0; i < kvp.Value.Count(); i++) 
    { 
     richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine); 
    } 
} 
2

最近我遇到了类似的问题。我选择的解决方案是将扩展方法添加到richtextbox。我喜欢这种方法,因为它干净,容易,易于重用。

这使得暂停重绘很简单,只要

richtextbox.SuspendDrawing(); 

和恢复

richtextbox.ResumeDrawing() 

public static class RichTextBoxExtensions 
{ 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    private const int WM_SETREDRAW = 0x0b; 

    public static void SuspendDrawing(this System.Windows.Forms.RichTextBox richTextBox) 
    { 
     SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); 
    } 

    public static void ResumeDrawing(this System.Windows.Forms.RichTextBox richTextBox) 
    { 
     SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
     richTextBox.Invalidate(); 
    } 
} 

来源:https://stackoverflow.com/a/487757/3442448