Контролируют ли Control.SuspendLayout и Control.ResumeLayout счет?

Я не могу придумать, как сформулировать вопрос, чтобы быть точным, но, надеюсь, мой смысл будет ясен. Контролируют ли Control.SuspendLayout и Control.ResumeLayout счет?

Иными словами, если я дважды вызываю SuspendLayout и один раз ResumeLayout, приостановится ли макет?

2 ответа

Решение

Там мало причин, чтобы застрять в вопросе, как этот. Исходный код доступен, под названием "Справочный источник". Лучший способ получить это - .NET Mass Downloader. Не каждая сборка.NET публикует свой исходный код, ваша резервная копия - почтенный Reflector.

В любом случае, исходный код выглядит примерно так:

private byte layoutSuspendCount;

public void SuspendLayout() {
  layoutSuspendCount++;
  if (layoutSuspendCount == 1) OnLayoutSuspended();
}

public void ResumeLayout() {
  ResumeLayout(true);
}

public void ResumeLayout(bool performLayout) {
  if (layoutSuspendCount > 0) {
    if (layoutSuspendCount == 1) OnLayoutResuming(performLayout);
    layoutSuspendCount--;
    if (layoutSuspendCount == 0 && performLayout) {
      PerformLayout();
    }
  }
} 

internal void PerformLayout(LayoutEventArgs args) {
  if (layoutSuspendCount > 0) {
    //...
    return;
  }
  //etc...
}

Итак, ответ на ваш вопрос: да.

Если я дважды вызову SuspendLayout и один раз ResumeLayout, приостановится ли макет?

Нет. Макет возобновлен.

Другие вопросы по тегам