Разница между событиями Resize и SizeChanged
В С#.Net в Winforms,
Я обнаружил два события почти во всех компонентах: Resize() и SizeChanged().
Есть ли разница между ними?
Если оба события одинаковы, то почему С# предоставляет два разных события?
Я создаю пользовательский элемент управления на С#. Этот элемент управления содержит текстовое поле.
Я хочу изменить размер текстового поля, когда пользователь изменит размер элемента управления.
Я смущен тем, какое событие я должен использовать и почему?
Ответы
Ответ 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
, вы должны знать о следующих отличиях:
Например, почему бы не волновать, например, чтобы убедиться, что их логика выполнена до того, как базовая реализация (и, следовательно, до недействительности) будет правильно нарисована на экране.
Пол: Мужской
Это два события перемещения, которые параллельны SizeChanged
и Resize
почти одинаково. Исключение состоит в том, что OnMove()
только отменяет действие, когда стиль, ControlStyles.SupportsTransparentBackColor
является истинным, а обратная сторона - менее чем непрозрачным значением альфа. И OnMove()
не будет запускать макет.
Опять же, эта разница, вероятно, имеет значение только для контроля над авторами.
Выводы
Исследуя исходный код, я пришел к выводу, что события Resize
и Move
являются абстракцией от измененных событий свойства и, вероятно, будут предпочтительным выбором для подписки и переопределения этих конкретных событий.
Как отмечают другие, событие Layout
и OnLayout()
также являются достойным выбором; однако макеты могут возникать во многих случаях:
- Когда дочерние элементы управления добавляются/удаляются.
- Когда границы управления меняются.
- Когда происходят другие изменения, которые могут повлиять на компоновку элемента управления.
Side Note: "Другие изменения" являются неопределенными, но я предполагаю, что Microsoft ссылается на любые действия, предпринятые наследниками, которым требуется макет.
Опираясь слишком сильно на события макета, вы можете замедлить ваш код/управление, поскольку они будут происходить чаще, чем простое событие изменения размера. Или возможно, что механизм компоновки может быть приостановлен SuspendLayout()
В этом случае вы не сможете реагировать на изменения размера через событие Layout
.