10

我在 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); 并在表单恢复后启用。我注意到如果我不重新启用文本框 repaint ,表格 repaint lag 也存在。

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

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

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

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

4

2 回答 2

1

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

于 2013-01-07T20:33:31.120 回答
0

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

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

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

于 2013-01-02T22:03:53.163 回答