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

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

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

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


person zulfin    schedule 02.01.2013    source источник
comment
Установите для свойства WordWrap значение False. Это дорого.   -  person Hans Passant    schedule 03.01.2013
comment
WordWrap необходим для моих целей. Кроме того, я не сталкиваюсь с проблемой перерисовки во время обновления текстового поля или перемещения формы - только когда окно восстанавливается из состояния свертывания.   -  person zulfin    schedule 03.01.2013
comment
Ну, вы просили совета. Отказ от него был ожидаемым результатом.   -  person Hans Passant    schedule 03.01.2013
comment
В образце, который я сделал с использованием переопределенного текстового поля ниже с 3 МБ текста, был включен перенос по словам и немедленное восстановление.   -  person Pete    schedule 03.01.2013


Ответы (2)


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

person zulfin    schedule 07.01.2013

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

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

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

person Pete    schedule 02.01.2013
comment
Я пробовал это решение, но ничего не изменилось, когда окно восстанавливается, вся форма перекрашивается, включая текстовое поле - person zulfin; 03.01.2013
comment
Тогда в вашей форме происходит что-то еще. Если вы поместите это текстовое поле в форму и поместите в него 3 МБ текста, а затем сверните и восстановите, это произойдет немедленно. Попробуйте свести к минимуму и восстановить, и пока он зависает, выполните Debug / Break All и посмотрите, что такое трассировка стека. - person Pete; 03.01.2013
comment
Нашел проблему !!! Проблема была связана со свойством якоря текстового поля. как только я удалил его, восстановление окна было немедленным. Кстати, новый пользовательский класс не требуется - person zulfin; 03.01.2013