Иногда эти ответы приходят только из исходного кода:
SizeChanged
Событие SizeChanged
вызывается OnSizeChanged()
. Эта функция, в свою очередь, вызывается только UpdateBounds()
, который вызывается несколькими механизмами, в первую очередь включающими обработку сообщений WM_MOVE
и WM_WINDOWPOSCHANGED
.
Снова из источника, OnSizeChanged()
будет вызываться только тогда, когда UpdateBounds()
определит, что есть разница между старым размером и новым размером . Итак, да, как уже определили другие, событие SizeChanged
соответствует изменению свойства Size
.
Изменение размера
Событие Resize
отличается от , но ненамного. Повышается на OnResize()
. Эта функция вызывается как прямой результат OnSizeChanged()
. Однако обратное неверно. То есть, OnResize()
НЕ звоните OnSizeChanged()
.
Разница заключается в том, с какой точки зрения вы используете эти API. Если вы просто подписываетесь на эти события, то разницы практически нет. В любом случае, при каждом изменении размера элемента управления оба события запускаются.
Однако, если вы наследуете Control
, необходимо помнить о следующих различиях:
Причина, по которой можно, например, беспокоиться, заключается в том, чтобы убедиться, что их логика выполняется перед базовой реализацией (и, следовательно, перед аннулированием), чтобы правильно отображаться на экране.
LocationChanged and Move
Это два события перемещения, которые параллельны SizeChanged
и Resize
почти одинаково. Исключением является то, что OnMove()
становится недействительным только тогда, когда стиль, ControlStyles.SupportsTransparentBackColor
равен true , а задний цвет меньше непрозрачного альфа-значения. И, OnMove()
не будет запускать макет.
Опять же, эта разница, вероятно, имеет значение только для контроля авторов.
Выводы
После изучения исходного кода я пришел к выводу, что события Resize
и Move
находятся на расстоянии абстракция от событий, изменяющих свойство, и, вероятно, будут предпочтительным выбором как для подписки, так и для подписки. переопределяя эти конкретные события.
Как уже упоминалось, событие Layout
и функция OnLayout()
также являются достойным выбором; однако макеты могут встречаться во многих случаях:
- Когда дочерние элементы управления добавляются / удаляются.
- При изменении границ элемента управления.
- Когда происходят другие изменения , которые могут повлиять на компоновку элемента управления.
Примечание: «Прочие изменения» расплывчаты, но я предполагаю, что Microsoft ссылается на любые действия, предпринимаемые наследниками, для которых требуется макет.
Слишком сильная зависимость от событий макета может замедлить ваш код / элемент управления, поскольку они будут происходить чаще, чем простое событие изменения размера. Либо возможно, что механизм размещения будет приостановлен на SuspendLayout()
. В этом случае вы не сможете реагировать на изменения размера с помощью события Layout
.