Подтвердить что ты не робот

Восстановление WinForm с текстовым полем, содержащим большой объем данных

Я создал форму в С# (VS2010), которая содержит (среди прочего) элемент управления текстовым полем. Текстовое поле может содержать большое количество данных в некоторой точке (~ 3 миллиона символов).

При прокрутке или перемещении формы вокруг проблем не возникает, но когда форма сведена к минимуму и восстанавливается снова, запускается последовательность перерисовки (я считаю), которая вызывает большую задержку в 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); и возврат назад после восстановления формы. Я заметил, что отставание формы repaint существует и в том случае, если я не повторно активировал перерисовку текстового поля.

  • Ручной двойной буфер с использованием растрового изображения - аналогичные результаты, как # 1.

Я где-то читал, что эта проблема может быть связана с элементом управления текстовым полем, пытающимся сжимать или корректировать объем данных, но не может его переопределить.

Ранее у меня был тот же проект в MFC, но он не встречал никаких проблем с перерисовкой или отставанием.

Пожалуйста, сообщите мне, как решить эту проблему.

4b9b3361

Ответ 1

Нашел проблему!!! Проблема связана с свойством Anchor текстового поля. Как только я удалил его, восстановление окна было незамедлительным. BTW, новый пользовательский класс не требуется

Ответ 2

Возможно, я что-то не понимаю (или, может быть, есть причина, по которой вы не можете этого сделать), но не можете ли вы просто получить свой собственный класс TextBox?

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

А затем используйте его вместо обычного текстового поля?