Възстановяване на 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 MB текст, пренасянето на думи беше включено и възстановяването беше незабавно.   -  person Pete    schedule 03.01.2013


Отговори (2)


Открих проблема!!! Проблемът беше свързан със свойството Anchor на текстовото поле. след като го премахнах, възстановяването на прозореца беше незабавно. Между другото, новият персонализиран клас не е задължителен

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
Тогава има нещо друго, което се случва във вашата форма. Ако поставите това текстово поле във формуляр и поставите 3MB текст в него и минимизирате и възстановите, това ще се случи незабавно. Опитайте да минимизирате и възстановите и докато виси, направете Debug/Break All и вижте каква е следата на стека. - person Pete; 03.01.2013
comment
Открих проблема!!! Проблемът беше свързан със свойството Anchor на текстовото поле. след като го премахнах, възстановяването на прозореца беше незабавно. Между другото, новият персонализиран клас не е задължителен - person zulfin; 03.01.2013