2016-07-01 3 views
2

Когда я вызываю метод Invalidate на скрытый или невидимый элемент управления, событие paint не запускается.Control.Invalidate не вызывает событие рисования скрытого или невидимого элемента управления

Это поведение элементов управления окнами? Есть ли доступная документация?

Я проверил документацию Control.Invalidate метода, но он не упоминает о невидимых элементах управления https://msdn.microsoft.com/en-in/library/system.windows.forms.control.invalidated(v=vs.110).aspx

Я проверил следующий SO вопроса How are the painting of invisible controls handled in WinForms? но попросили мерцающую проблему в компактной структуре и не имеет отношение к моему вопросу

+0

Почему вы полагаетесь на невидимое управление, которое нарисовано? – Ryan

+0

Мое управление присутствует на закладке. Я хочу, чтобы он не обновлялся и не рисовал, если он не виден. Поскольку окраска невидимого управления снижает производительность – Kira

+0

Вызов invalidate только ставит управление в состояние готовности к рисованию. Краска не запускается, пока она не нарисована на экране. Поэтому не беспокойтесь - такая производительность хорошо обрабатывается Windows. – Tommy

ответ

4

Ну, я думаю, что лучший способ исследовать это - проверить исходный код Microsoft. Это то, что происходит:

Когда значение Control установлено на Visible false, флаг созданной ручки управления также установлен в false.

Метод Invalidate() (исходный код ниже) не выполняет свою работу, когда IsHandleCreated является ложным; На самом деле это история.

/// <include file='doc\Control.uex' path='docs/doc[@for="Control.Invalidate3"]/*' /> 
/// <devdoc> 
///  Invalidates the control and causes a paint message to be sent to the control. 
///  This will not force a synchronous paint to occur, calling update after 
///  invalidate will force a synchronous paint. 
/// </devdoc> 
public void Invalidate(bool invalidateChildren) 
{ 
    if (IsHandleCreated) 
    { 
     if (invalidateChildren) 
     { 
      SafeNativeMethods.RedrawWindow(new HandleRef(window, Handle), 
              null, NativeMethods.NullHandleRef, 
              NativeMethods.RDW_INVALIDATE | 
              NativeMethods.RDW_ERASE | 
              NativeMethods.RDW_ALLCHILDREN); 
     } 
     else 
     { 
      // It's safe to invoke InvalidateRect from a separate thread. 
      using (new MultithreadSafeCallScope()) 
      { 
       SafeNativeMethods.InvalidateRect(new HandleRef(window, Handle), 
                null, 
                (controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque); 
      } 
     } 

     NotifyInvalidate(this.ClientRectangle); 
    } 
} 
Смежные вопросы