【问题标题】:Restoring WinForm with textbox containing large amount of data使用包含大量数据的文本框恢复 WinForm
【发布时间】:2013-01-02 19:57:07
【问题描述】:

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

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

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

  1. 使用双缓冲——根据我的阅读,双缓冲仅适用于表单本身,而不适用于其控件

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

  2. 在最小化后禁用文本框重绘:SendMessage(this.my_textBox.Handle, WM_SETREDRAW, false, 0); 并在表格恢复后重新启用。我注意到如果我不重新启用文本框重绘,表单重绘滞后也存在。

  3. 使用位图的手动双缓冲区——结果与 #1 类似。

我在某处读到此问题可能与尝试缩小或调整数据量的文本框控件有关,但无法覆盖它。

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

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

【问题讨论】:

  • 将 WordWrap 属性设置为 False。很贵。
  • WordWrap 对于我的目的来说是必不可少的。此外,在更新文本框或移动表单时,我不会遇到任何重绘问题 - 只有当窗口从最小化状态恢复时。
  • 嗯,你征求意见。不服用是预期的结果。
  • 在我使用下面覆盖的文本框和 3MB 文本制作的示例中,自动换行已打开,并且立即恢复。

标签: c# winforms textbox restore repaint


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    然后用它代替常规的文本框?

    【讨论】:

    • 我尝试了这个解决方案,但没有任何改变,当窗口恢复时,整个表单都被重新绘制,包括文本框
    • 那么您的表单中还有其他内容。如果你把这个文本框放在一个表单上,然后把 3MB 的文本放进去,然后最小化和恢复,它会立即发生。尝试最小化和恢复,并在挂起时执行 Debug/Break All 并查看堆栈跟踪是什么。
    • 找到问题了!!!问题与文本框锚属性有关。一旦我删除它,窗口恢复是立即的。顺便说一句,不需要新的自定义类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多