C#: ResumeLayout(true) делает то же самое, что ResumeLayout(false) + PerformLayout()?

Я посмотрел на сгенерированный дизайнерский код Form с и UserControl с, и в InitializeComponent() Метод, который они всегда начинают с

    this.SuspendLayout();

и заканчивается

    this.ResumeLayout(false);
    this.PerformLayout();

Но из того, что я вижу в документации MSDN этих методов, не заканчивается

    this.ResumeLayout(true); // Or just this.ResumeLayout()

сделать то же самое? Или я что-то здесь упускаю?

Спрашиваю, потому что я буду добавлять кучу элементов управления в другом методе, и подумал, что я должен сделать процедуру приостановки-возобновления, чтобы быть красивой и эффективной. Но не могу понять, в чем причина этих двух вызовов методов, когда вы, казалось бы, можете просто использовать один...

2 ответа

Решение

Используя отражатель:

this.ResumeLayout() is equal to this.ResumeLayout(true)

Но

this.ResumeLayout(true) is not equal to this.ResumeLayout(false) + this.PerformLayout()

Причина:
Когда ResumeLayout вызывается с false, существует циклическая коллекция элементов управления, и LayoutEngine вызывает InitLayout для каждого из элементов управления в макете.

SuspendLayout

При добавлении нескольких родительских элементов управления рекомендуется вызывать метод SuspendLayout перед инициализацией добавляемых элементов управления. После добавления элементов управления в родительский элемент управления вызовите метод ResumeLayout. Это повысит производительность приложений со многими элементами управления.

PerformLayout

Это заставляет элемент управления применять логику компоновки ко всем дочерним элементам управления. Если метод SuspendLayout был вызван до вызова метода PerformLayou t, событие Layout подавляется. Событие макета может быть подавлено с помощью методов SuspendLayout и ResumeLayout.

MSDN Link - метод PerformLayout

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