C# 使用包含大量数据的文本框还原WinForm
我在C#(VS2010)中创建了一个表单,其中包含一个文本框控件。 文本框可能在某个点(约300万个字符)包含大量数据 滚动或移动表单时不会遇到任何问题,但是当表单最小化并再次恢复时,会触发重新绘制序列(我相信),这会导致表单重新绘制的时间延迟约5-10秒 我已经尝试过几种解决方案: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
this.SetStyle(ControlStyles.DoubleBuffer,true)代码>
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true)代码>
this.SetStyle(ControlStyles.UserPaint,true)代码>
SendMessage(this.my_textbox.Handle,WM_SETREDRAW,false,0)代码>
并在窗体恢复后启用返回。我注意到,如果我不重新启用文本框重绘,表单重绘延迟也会存在
请告诉我如何解决这个问题。我可能不理解某些东西(或者可能有一个原因你不能这么做),但是你不能这样派生你自己的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锚属性有关。一旦我删除了它,窗口恢复是立即的。顺便说一句,新的自定义类不是必需的