Разница между событиями Resize и SizeChanged - PullRequest
26 голосов
/ 16 сентября 2011

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

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

Ответы [ 3 ]

23 голосов
/ 16 сентября 2011

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

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

14 голосов
/ 16 сентября 2011

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

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

10 голосов
/ 19 января 2018

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

SizeChanged

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

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

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

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

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

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

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

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

LocationChanged and Move

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

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

Выводы

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

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

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

    Примечание: «Прочие изменения» расплывчаты, но я предполагаю, что Microsoft ссылается на любые действия, предпринимаемые наследниками, для которых требуется макет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...