FrameworkElement.SizeChanged 事件

定义

ActualHeightActualWidth 属性更改 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 只要对象上的 ActualHeightActualWidth) 的大小 (发生更改(即 MeasureArrange 传递完成后),就会触发。

事件的 SizeChangedEventArgs 事件数据 SizeChanged 提供两个属性: PreviousSize 值(表示布局更改之前元素的大小)和 NewSize 值(表示当前大小)。 若要获取高度和宽度信息,请在事件处理程序中为这些 SizeChangedEventArgs 属性使用 Size 结构值的HeightWidth 值。

处理事件 SizeChanged 的原因之一是查看元素的 ActualHeightActualWidth 的比率是否因新布局而更改。 例如,如果用户调整了应用窗口的大小,而整个应用视图现在为较窄的视图,则可能会发生这种情况。

SizeChanged 由于 UI 元素的 ActualHeightActualWidth 值在布局发生之前未定义,因此在首次激活应用时,在页面上元素的初始布局期间发生。 它们仅在初始布局传递期间获取值,因此会发生 SizeChanged 事件。 此后,在应用的生存期内,SizeChanged如果 和 ActualWidth 值因其他原因而更改,ActualHeight该事件可能会再次从元素触发。 其中包括:

  • 专门调整该元素的 HeightWidth 的代码。
  • 更改影响 ActualHeight) 的约束属性 ((如 MinHeight 或 MaxHeight的代码。
  • 刷新的数据绑定值或应用了影响 FrameworkElement 的任何布局相关属性的新样式。
  • 调整容器尺寸的代码,例如作为元素父级的 PanelListBox 。 这通常会触发布局传递。 由于新的布局条件,包含的子元素现在可能具有更多或更少的可用空间,这可能会导致内部元素产生新的 ActualHeightActualWidth
  • 运行时发生的其他更改会更改布局空间,即使它们不直接更改 FrameworkElement 布局属性。 例如,基于项的数据绑定的列表可能会刷新或更新,这可能会导致项、项控件、列表视图等的大小更改。 或者,支持增量加载的列表视图可能会提取更多项并展开列表视图。
  • 用户更改应用 Window 大小 (Window.SizeChanged 发生) ,这反过来又会影响顶级 页面 的大小,并影响该页面中使用“自动”布局或 Stretch 对齐方式且未指定尺寸的自适应布局派生元素的大小。
  • ApplicationView 更改或 DisplayInformation 更改,最终会影响窗口和页面尺寸,并可能影响其中的所有 UI 元素。

严格来说,没有必要避免从处理程序中 SizeChanged 调用影响当前对象布局的其他 API。 例如:设置 HeightWidth;调用 InvalidateMeasureUpdateLayout;调用 ApplyTemplate;任何可能重设子元素大小,从而使父布局失效的操作。 布局引擎具有在对象再次触发事件之前稳定值的内部逻辑,因此逻辑通常足够可靠,可以避免循环情况。 但是,仍可能无意中定义可以挂起应用的大小调整或呈现循环,这通常会引发 LayoutCycleException 等异常,而不是实际挂起。 如果与周围布局结合使用的处理程序逻辑无法达到相关对象大小的最终结果,则会发生此情况。

如果对象在父容器中的位置更改,但大小不更改, SizeChanged 则不会发生。

LayoutUpdated 是类似的事件,但也 LayoutUpdated 因位置更改而触发。 此外, LayoutUpdated 事件范围不限定为特定对象的布局属性,它报告包含对象的整个可视化树。 LayoutUpdated 通知你包含对象的整体可视化树中的内容已更改,但布局细节 (处理程序所附加的对象的大小、位置) 可能没有更改。

尽管此事件使用 RoutedEventHandler 相关的委托和 RoutedEventArgs 派生的类作为事件数据,但该事件并不是真正的路由事件。 它不会在对象树中冒泡。 它只能在源自事件的元素上处理, (换言之,发送方) 。 此事件的事件数据中的 OriginalSource 始终null为 ,因此请不要尝试使用 OriginalSource

适用于

另请参阅