FrameworkElement.SizeChanged Событие
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Происходит при изменении значения свойства ActualHeight или ActualWidth в FrameworkElement.
public:
virtual event SizeChangedEventHandler ^ SizeChanged;
// Register
event_token SizeChanged(SizeChangedEventHandler const& handler) const;
// Revoke with event_token
void SizeChanged(event_token const* cookie) const;
// Revoke with event_revoker
FrameworkElement::SizeChanged_revoker SizeChanged(auto_revoke_t, SizeChangedEventHandler const& handler) const;
public event SizeChangedEventHandler SizeChanged;
function onSizeChanged(eventArgs) { /* Your code */ }
frameworkElement.addEventListener("sizechanged", onSizeChanged);
frameworkElement.removeEventListener("sizechanged", onSizeChanged);
- or -
frameworkElement.onsizechanged = onSizeChanged;
Public Custom Event SizeChanged As SizeChangedEventHandler
<frameworkElement SizeChanged="eventhandler"/>
Тип события
Комментарии
SizeChanged срабатывает каждый раз, когда размер объекта ( ActualHeight или ActualWidth) изменяется после завершения проходов Measure и Arrange .
Данные события SizeChangedEventArgs для события SizeChanged предоставляют два свойства: значение PreviousSize , представляющее размер элемента до изменения макета, и значение NewSize , представляющее текущий размер. Чтобы получить сведения о высоте и ширине, используйте значения Height и Width значения структуры Size для этих свойств SizeChangedEventArgs в обработчике событий.
Одна из причин обработки события SizeChanged заключается в том, чтобы узнать, изменилось ли соотношение ActualHeight и ActualWidth элемента из-за нового макета. Например, это может произойти, если пользователь изменил размер окна приложения и общее представление приложения теперь является узким.
SizeChanged возникает при первоначальном макете элементов на странице при первой активации приложения, так как значения ActualHeight и ActualWidth для элементов пользовательского интерфейса не определены до того, как произойдет макет. Они получают значения только во время начального прохода макета, поэтому возникает событие SizeChanged. После этого, в течение жизненного цикла приложения, событие SizeChanged может снова возникать из элемента, если значения ActualHeight и ActualWidth изменяются по другим причинам. К ним относятся следующие объекты.
- Код, который специально настраивает значения Height и Width этого элемента.
- Код, который изменяет свойства ограничения (например , MinHeight или MaxHeight , влияющие на ActualHeight).
- Обновлены значения привязки данных или применены новые стили, которые влияют на любые связанные с макетом свойства FrameworkElement.
- Код, который корректирует размеры контейнера, например Panel или ListBox , который является родительским для элемента. Это часто приводит к запуску этапа макета. Из-за новых условий макета в автономном дочернем элементе теперь может быть доступно больше или меньше места, что может привести к порождению ActualHeight и ActualWidth для элемента внутри.
- Другие изменения, происходящие во время выполнения, которые изменяют пространство макета, даже если они не изменяют свойства макета FrameworkElement напрямую. Например, список, основанный на привязке данных к элементам, может обновляться или обновляться, что может привести к изменению размера элементов, элементов управления, представлений списков и т. д. Представление списка, поддерживающее добавочную загрузку, может получить больше элементов и развернуть представление списка.
- Пользователь изменяет размер окна приложения (возникает Window.SizeChanged ), что, в свою очередь, влияет на размер страницы верхнего уровня и, возможно, на размеры элементов, производных от адаптивного макета на этой странице, которые используют макет "Авто" или выравнивание Растяжения и не указывают измерения.
- Изменения ApplicationView или DisplayInformation , которые в конечном итоге влияют на размеры окна и страницы, а также, возможно, на все элементы пользовательского интерфейса.
Не обязательно избегать вызова других API, влияющих на макет текущего объекта, из обработчика SizeChanged. Например, установка высоты или ширины; вызов InvalidateMeasure или UpdateLayout; вызов Метода ApplyTemplate; любая операция, которая может изменить размер дочерних элементов и, таким образом, сделать родительский макет недействительным. Подсистема макета имеет внутреннюю логику, которая стабилизирует значения до того, как объект снова активирует событие, поэтому логика обычно достаточно надежна, чтобы избежать условий цикла. Однако по-прежнему можно непреднамеренно определить размер или циклы отрисовки, которые могут зависнуть приложение, что обычно вызывает исключения, такие как LayoutCycleException , а не зависание. Это происходит, если логика обработчика в сочетании с окружающим макетом не может достичь конечного результата для размера соответствующего объекта.
Если положение объекта в родительском контейнере изменяется, но не изменяется размер, SizeChanged не будет выполняться.
LayoutUpdated — это аналогичное событие, но LayoutUpdated также активируется для изменения положения. Кроме того, вхождение LayoutUpdated не ограничивается свойствами макета конкретного объекта. Оно сообщает о всем визуальном дереве, в котором содержится объект. LayoutUpdated сообщает, что что-то в общем визуальном дереве, содержащее объект, изменилось, но особенности макета (размер, положение) объекта, к которому присоединен обработчик, возможно, не изменились.
Хотя это событие использует делегат, связанный с RoutedEventHandler, и класс, производный от RoutedEventArgs, в качестве данных события, это событие не является на самом деле перенаправленным событием. Он не проходит через дерево объектов. Он может обрабатываться только для элемента, который является источником события (иными словами, отправителя). OriginalSource в данных события для этого события всегда имеет значение NULL, поэтому не пытайтесь использовать OriginalSource.