C# 使用包含大量数据的文本框还原WinForm

C# 使用包含大量数据的文本框还原WinForm,c#,winforms,textbox,restore,repaint,C#,Winforms,Textbox,Restore,Repaint,我在C#(VS2010)中创建了一个表单,其中包含一个文本框控件。 文本框可能在某个点(约300万个字符)包含大量数据 滚动或移动表单时不会遇到任何问题,但是当表单最小化并再次恢复时,会触发重新绘制序列(我相信),这会导致表单重新绘制的时间延迟约5-10秒 我已经尝试过几种解决方案: 使用双缓冲区——根据我读到的内容,双缓冲只适用于表单本身,而不适用于其控件 this.SetStyle(ControlStyles.DoubleBuffer,true) this.SetStyle(ControlS

我在C#(VS2010)中创建了一个表单,其中包含一个文本框控件。 文本框可能在某个点(约300万个字符)包含大量数据

滚动或移动表单时不会遇到任何问题,但是当表单最小化并再次恢复时,会触发重新绘制序列(我相信),这会导致表单重新绘制的时间延迟约5-10秒

我已经尝试过几种解决方案:

  • 使用双缓冲区——根据我读到的内容,双缓冲只适用于表单本身,而不适用于其控件

    this.SetStyle(ControlStyles.DoubleBuffer,true)
    
    this.SetStyle(ControlStyles.AllPaintingInWmPaint,true)
    
    this.SetStyle(ControlStyles.UserPaint,true)

  • 使用以下命令禁用最小化后的文本框重绘:
    SendMessage(this.my_textbox.Handle,WM_SETREDRAW,false,0)
    并在窗体恢复后启用返回。我注意到,如果我不重新启用文本框重绘,表单重绘延迟也会存在

  • 使用位图手动双缓冲–结果与#1类似

  • 我在某个地方读到,这个问题可能与textbox控件试图缩小或调整数据量有关,但无法覆盖它

    我以前在MFC有相同的项目,但没有遇到任何重绘或滞后的问题


    请告诉我如何解决这个问题。

    我可能不理解某些东西(或者可能有一个原因你不能这么做),但是你不能这样派生你自己的TextBox类吗

    public class MyTextBox : TextBox
    {
        public MyTextBox() : base()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint |
                ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, false); 
        }
    }
    

    然后用它代替普通的文本框?

    发现了问题!!!问题与textbox锚属性有关。一旦我删除了它,窗口恢复是立即的。顺便说一句,不需要新的自定义类

    将WordWrap属性设置为False。它很贵。WordWrap对我来说是必不可少的。此外,在更新文本框或移动表单时,我不会遇到任何重绘问题-只有在窗口从最小化状态恢复时才会遇到。好吧,您征求了建议。不使用它是预期的结果。在我使用下面覆盖的文本框(包含3MB文本)制作的示例中,word wrap已启用,并且立即恢复。我尝试了此解决方案,但没有任何更改,当窗口在重新绘制时恢复整个表单(包括文本框),则表单中会出现其他情况。如果您将此文本框放置在表单上,并将3MB文本放入其中,然后最小化并还原,则会立即发生。尝试最小化和还原,并在挂起时进行调试/全部中断,查看堆栈跟踪。发现问题!!!问题与textbox锚属性有关。一旦我删除了它,窗口恢复是立即的。顺便说一句,新的自定义类不是必需的