C# 如何避免richTextBox.Clear();闪光/闪烁?

C# 如何避免richTextBox.Clear();闪光/闪烁?,c#,richtextbox,C#,Richtextbox,我有这个功能: private void clearRichtextBox() { richTextBox2.Clear(); foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords) { for (int i = 0; i < kvp.Value.Count(); i++) { richTextBox2.App

我有这个功能:

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);
        }
    }   
}
private void clearRichtextBox()
{
richTextBox2.Clear();
foreach(LocalyKeyWords中的KeyValuePair kvp)
{
对于(int i=0;i

它正在执行
Clear()它看起来像richTextBox闪烁/闪烁毫秒左右。有什么办法可以避免停止吗?

这就是它的工作原理。您可以尝试在窗体上启用双缓冲:

this.DoubleBuffered = true;
另一种方法是继承RichTextBox控件,并使用
SetStyle()
重写其新的()方法,以便为控件本身启用双缓冲

如何使用此方法执行此操作:

public class MyRichTextBox : RichTextBox {

    protected override void New() {
        base.New();
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }
}
然后,您需要执行以下步骤:

  • 关闭设计器窗口
  • 打开设计器文件
  • 您需要将
    RichTextBox
    替换为
    MyRichTextBox
    两次,一次靠近声明它的文件顶部,另一次靠近初始化它的文件底部
  • 保存并重新打开设计器/测试
  • 这也可能有帮助:


    它使用SendMessage打开/关闭控件的重画模式

    我没有尝试查看它是否也会闪烁,但您可以将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);
        }
    } 
    
    richTextBox2.Text=”“;
    foreach(LocalyKeyWords中的KeyValuePair kvp)
    {
    对于(int i=0;i
    您无法避免
    RichTextBox
    的固有行为,即每当文本发生更改时,至少会将一次重画排队,但在您提供的代码段中,您可以将“准备带外文本”设置为“准备带外文本”,而不是调用“清除”。这将把视觉活动的变化量减少到最小,而不必改变它的正常操作。此外,看起来您希望保持内容与KeyValue集的视图相同

    在将文本应用于
    RichTextBox
    之前,请使用
    StringBuilder
    组合文本,如果存在差异,请指定
    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;
        }
    }
    
    private void clearRichtextBox()
    {
    StringBuilder sb=新的StringBuilder();
    foreach(LocalyKeyWords中的KeyValuePair kvp)
    {
    对于(int i=0;i
    我最近遇到了类似的问题。我选择的解决方案是向richtextbox添加扩展方法。我喜欢这种方法,因为它干净、包含并且易于重用

    这使得暂停重画非常简单

    richtextbox.SuspendDrawing();
    
    恢复

    richtextbox.ResumeDrawing()
    



    来源:

    闪烁或闪烁与“绘制”事件有关,如果您反复清除,则不可避免!你真的需要每次都清除所有内容吗?!Milad每次单击“确定”时,我都会清除它。这不是自动的。如果有其他方法可以不使用clear()清除/删除richTextBox中的所有文本,我就是在使用它。还有其他方法吗?Abdias尝试了DoubleBuffered=true;在构造函数中,它没有帮助。您能告诉我如何使用新的()SetStyle()为控件启用双缓冲吗?好的。你的解决方案肯定比我的更正确。所以,+1meklarian做得很好,我只是在AppendFormat中添加了缺少的“--”,它工作得很好。
    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();
        }
    }