2012-10-14 159 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