FrameworkElement.SizeChanged 事件
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
当 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"/>
事件类型
注解
每当对象上 “ActualHeight ”或“ ActualWidth ”) 的大小 (发生更改时,即 在 Measure 和 Arrange 传递完成之后,SizeChanged 就会触发。
SizeChanged 事件的 SizeChangedEventArgs 事件数据提供两个属性:PreviousSize 值(表示布局更改之前元素的大小)和 NewSize 值(表示当前大小)。 若要获取高度和宽度信息,请在事件处理程序中为这些 SizeChangedEventArgs 属性使用 Size 结构值的 Height 和 Width 值。
处理 SizeChanged 事件的一个原因是查看元素的 ActualHeight 与 ActualWidth 的比率是否因新布局而更改。 例如,如果用户调整了应用窗口的大小,而整个应用视图现在为窄视图,则可能会发生这种情况。
当应用第一次激活时,在页面上元素的初始布局期间发生 SizeChanged,因为 UI 元素的 ActualHeight 和 ActualWidth 值在布局发生之前未定义。 它们仅在初始布局传递期间获取值,因此会发生 SizeChanged 事件。 此后,在应用的生存期内,如果 ActualHeight 和 ActualWidth 值因其他原因而更改,SizeChanged 事件可能会再次从元素触发。 其中包括:
- 专门调整该元素 的高度 和 宽度 的代码。
- 更改约束属性的代码 (影响 ActualHeight) 的 MinHeight 或 MaxHeight 。
- 数据绑定值刷新或应用的新样式,这些样式会影响 FrameworkElement 的任何布局相关属性。
- 调整容器尺寸的代码,例如作为元素的父级的 Panel 或 ListBox 。 这通常会触发布局传递。 由于新的布局条件,包含的子元素现在可能具有更多或更少的可用空间,这可能会导致内部元素产生新的 ActualHeight 和 ActualWidth 。
- 运行时发生的其他更改会更改布局空间,即使它们不直接更改 FrameworkElement 布局属性。 例如,基于数据绑定到项的列表可能会刷新或更新,这可能会导致项、项控件、列表视图等中的大小更改。 或者,支持增量加载的列表视图可能会提取更多项并展开列表视图。
- 用户更改应用 Window 大小 (Window.SizeChanged 发生) ,这反过来又会影响顶级 页面 的大小,也可能影响该页面中使用“自动”布局或 拉伸 对齐方式且未指定维度的自适应布局派生大小。
- ApplicationView 更改或 DisplayInformation 更改,这些更改最终会影响窗口和页面尺寸,并可能影响其中的所有 UI 元素。
严格而言,没有必要避免从 SizeChanged 处理程序中调用影响当前对象布局的其他 API。 例如:设置 “高度” 或 “宽度”;调用 InvalidateMeasure 或 UpdateLayout;调用 ApplyTemplate;任何可能重设子元素大小并导致父布局失效的操作。 布局引擎具有在对象再次触发事件之前稳定值的内部逻辑,因此该逻辑通常足够可靠,可以避免循环情况。 但是,仍可能无意中定义可以挂起应用的大小调整或呈现循环,这通常会引发 LayoutCycleException 等异常,而不是实际挂起。 如果处理程序逻辑与周围布局相结合,无法达到相关对象大小的最终结果,则会发生这种情况。
如果对象在父容器中的位置更改,但不更改大小,则不会发生 SizeChanged。
LayoutUpdated 是类似的事件,但 LayoutUpdated 也会触发位置更改。 此外, LayoutUpdated 事件的范围不限定为特定对象的布局属性,它会报告包含对象的整个可视化树。 LayoutUpdated 会通知你,包含对象的总体可视化树中的某些内容已更改,但布局具体 (大小、附加处理程序的对象的位置) 可能没有更改。
尽管此事件使用 RoutedEventHandler 相关的委托和 RoutedEventArgs 派生类作为事件数据,但该事件并不是真正的路由事件。 它不会在对象树中冒泡。 只能在引发事件 (元素(即发送方) )进行处理。 此事件的事件数据中的 OriginalSource 始终为 null,因此请勿尝试使用 OriginalSource。