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"/>
事件類型
備註
SizeChanged
每當物件上的大小 (ActualHeight 或 ActualWidth) 變更時引發,也就是 Measure 和 Arrange 傳遞完成之後。
事件的 SizeChangedEventArgs 事件資料 SizeChanged
提供兩個屬性: PreviousSize 值,代表配置變更之前的專案大小,以及代表目前大小的 NewSize 值。 若要取得高度和寬度資訊,請使用事件處理常式內這些SizeChangedEventArgs屬性之Size結構值的Height和Width值。
處理 SizeChanged
事件的其中一個原因是,因為有新的版面配置,所以查看專案的 ActualHeight 與 ActualWidth 的比率是否已變更。 例如,如果使用者已調整應用程式視窗大小,而整體應用程式檢視現在是縮小檢視,就可能發生此情況。
SizeChanged
會在頁面上元素的初始配置期間發生,當應用程式第一次啟動時,因為 UI 元素的 ActualHeight 和 ActualWidth 值在配置發生之前未定義。 它們只會在初始版面設定階段取得值,因此會發生 SizeChanged 事件。 之後,在應用程式的存留期期間,如果 ActualHeight
和 ActualWidth
值因其他原因而變更, SizeChanged
事件就會再次引發元素。 其中包括:
- 特別調整該元素 之 Height 和 Width 的程式碼。
- 變更條件約束屬性的程式碼 (,例如 影響ActualHeight) 的 MinHeight 或 MaxHeight 。
- 重新整理的資料系結值,或套用會影響 FrameworkElement任何版面配置相關屬性的新樣式。
- 調整容器維度的程式碼,例如元素父代的 Panel 或 ListBox 。 這通常會觸發版面配置傳遞。 由於新的版面配置條件,內含的子項目現在可能具有更多或較少的可用空間,這可能會導致內元素的新 ActualHeight 和 ActualWidth 。
- 即使這些變更不是直接變更 FrameworkElement 版面配置屬性,也會在執行時間變更版面配置空間的其他變更。 例如,以專案資料系結為基礎的清單可能會重新整理或更新,而且可能會導致專案、專案控制項、清單檢視等大小變更。 或者,支援累加式載入的清單檢視可能會擷取更多專案並展開清單檢視。
- 使用者變更應用程式 視窗 大小 (Window.SizeChanged 發生) ,進而影響最上層 Page 的大小,以及該頁面中使用「自動」版面配置或
Stretch
對齊方式的彈性版面配置衍生大小,而且未指定維度。 - ApplicationView 變更或 DisplayInformation 變更,最終會影響視窗和頁面維度,以及內的所有 UI 元素。
不需要絕對避免呼叫影響目前物件配置的其他 API,從處理常式內 SizeChanged
。 例如:設定 高度 或 寬度;呼叫 InvalidateMeasure 或 UpdateLayout;呼叫 ApplyTemplate;任何可能重設子項目大小的作業,因而使父版面配置失效。 版面配置引擎的內部邏輯會在物件再次引發事件之前穩定值,因此邏輯通常夠強固,以避免迴圈狀況。 不過,仍然可能會不小心定義調整大小或轉譯迴圈,以停止回應您的應用程式,這通常會擲回 LayoutCycleException 之類的例外狀況,而不是實際停止回應。 如果與周圍配置結合的處理常式邏輯無法達到相關物件大小的結束結果,就會發生這種情況。
如果物件在父容器內的位置變更,但不會變更大小, SizeChanged
則不會發生。
LayoutUpdated 是類似的事件,但 LayoutUpdated
也會針對位置變更引發。 此外, LayoutUpdated
發生次數不會限定于特定物件的版面配置屬性,它會報告物件所包含的整個視覺化樹狀結構。
LayoutUpdated
會通知您包含物件的整體視覺化樹狀結構中的某個專案已變更,但配置細節 (大小、位置) 附加處理常式的物件可能尚未變更。
雖然此事件使用 RoutedEventHandler相關委派和 RoutedEventArgs衍生類別做為事件資料,但事件不是真正的路由事件。 它不會透過物件樹狀結構泡泡。 它只能處理在產生事件的專案上, (換句話說,傳送者) 。 此事件的事件資料中的OriginalSource一律 null
為 ,因此請勿嘗試使用 OriginalSource
。