Подтвердить что ты не робот

Разница между событиями Resize и SizeChanged

В С#.Net в Winforms, Я обнаружил два события почти во всех компонентах: Resize() и SizeChanged(). Есть ли разница между ними? Если оба события одинаковы, то почему С# предоставляет два разных события?

Я создаю пользовательский элемент управления на С#. Этот элемент управления содержит текстовое поле. Я хочу изменить размер текстового поля, когда пользователь изменит размер элемента управления. Я смущен тем, какое событие я должен использовать и почему?

4b9b3361

Ответ 1

Событие Resize происходит, когда элемент управления изменяется, а событие SizeChanged происходит, когда изменяется свойство Size.

Вы можете использовать либо, так как изменение размера приведет к изменению свойства Size. Однако лучше использовать событие Layout, как рекомендовано как в документации для Resize, так и SizeChanged.

Ответ 2

Итак, какова разница между событиями Resize и SizeChanged?

Верьте этому или нет абсолютно ничего. Один метод вызывает другой. Однако, поскольку последнее называется "Изменено", оно может использоваться для данных привязка - поэтому, хотя у меня нет каких-либо конкретных доказательств, моя теория о почему оба существуют.

Ответ 3

Иногда эти ответы исходят только из исходного кода:

SizeChanged

SizeChanged событие возникает в OnSizeChanged(). Эта функция, в свою очередь, UpdateBounds() только UpdateBounds(), которая вызывается несколькими механизмами, в первую очередь, включая обработку сообщений WM_MOVE и WM_WINDOWPOSCHANGED.

Опять же из источника OnSizeChanged() только тогда, когда UpdateBounds() определил, что существует разница между старым размером и новым размером. Итак, да, как уже определили SizeChanged событие SizeChanged соответствует изменению свойства Size.

Изменение размера

Событие Resize отличается, но не сильно. Он поднят OnResize(). Эта функция называется прямым результатом OnSizeChanged(). Однако обратное неверно. То есть, OnResize() не вызывает OnSizeChanged().

Разница заключается в перспективах, с которых вы используете эти API. Если вы просто подписываетесь на эти события, то практически нет разницы. В любом случае вы смотрите на него, всякий раз, когда изменяется размер управления, оба события срабатывают.

Однако, если вы наследуете Control, вы должны знать о следующих отличиях:

  • OnResize() приведет к аннулированию OnResize() управления, если установлен стиль, ControlStyles.ResizeRedraw.
  • OnResize() будет запускать макет с параметром AffectedProperty установленным на "Bounds".

Например, почему бы не волновать, например, чтобы убедиться, что их логика выполнена до того, как базовая реализация (и, следовательно, до недействительности) будет правильно нарисована на экране.

Пол: Мужской

Это два события перемещения, которые параллельны SizeChanged и Resize почти одинаково. Исключение состоит в том, что OnMove() только отменяет действие, когда стиль, ControlStyles.SupportsTransparentBackColor является истинным, а обратная сторона - менее чем непрозрачным значением альфа. И OnMove() не будет запускать макет.

Опять же, эта разница, вероятно, имеет значение только для контроля над авторами.

Выводы

Исследуя исходный код, я пришел к выводу, что события Resize и Move являются абстракцией от измененных событий свойства и, вероятно, будут предпочтительным выбором для подписки и переопределения этих конкретных событий.

Как отмечают другие, событие Layout и OnLayout() также являются достойным выбором; однако макеты могут возникать во многих случаях:

  • Когда дочерние элементы управления добавляются/удаляются.
  • Когда границы управления меняются.
  • Когда происходят другие изменения, которые могут повлиять на компоновку элемента управления.

    Side Note: "Другие изменения" являются неопределенными, но я предполагаю, что Microsoft ссылается на любые действия, предпринятые наследниками, которым требуется макет.

Опираясь слишком сильно на события макета, вы можете замедлить ваш код/​​управление, поскольку они будут происходить чаще, чем простое событие изменения размера. Или возможно, что механизм компоновки может быть приостановлен SuspendLayout() В этом случае вы не сможете реагировать на изменения размера через событие Layout.