FrameworkElement.SizeChanged 事件
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
發生于FrameworkElement上的ActualHeight或ActualWidth屬性值變更時。
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) 的大小 (變更物件時,就會引發 SizeChanged,也就是 Measure 和 Arrange 階段完成之後。
SizeChangedEventArgs 事件的 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.SizeChanged 發生) ,進而影響最上層 頁面 的大小,以及該頁面中使用 「自動」配置或 延展 對齊且未指定維度的調適型版面配置衍生大小。
- ApplicationView 變更或 DisplayInformation 變更,最終會影響視窗和頁面維度,以及其中所有 UI 元素。
不需要絕對避免呼叫影響目前物件配置的其他 API,從 SizeChanged 處理常式內。 例如:設定 高度 或 寬度;呼叫 InvalidateMeasure 或 UpdateLayout;呼叫 ApplyTemplate;任何可能調整大小子專案的作業,因而使父版面配置失效。 配置引擎具有內部邏輯,可在物件再次引發事件之前穩定值,因此邏輯通常夠強固,以避免迴圈狀況。 不過,仍然可能會不小心定義可停止回應您 app 的大小或轉譯迴圈,這通常會擲回 LayoutCycleException 之類的例外狀況,而不是實際停止回應。 如果與周圍配置結合的處理常式邏輯無法達到相關物件大小的結束結果,就會發生這種情況。
如果物件在父容器內的位置變更,但不會變更大小,則不會發生 SizeChanged。
LayoutUpdated 是類似的事件,但也會針對位置變更引發 LayoutUpdated 。 此外, LayoutUpdated 發生次數並未限定于特定物件的版面配置屬性,它會報告物件所包含的整個視覺化樹狀結構。 LayoutUpdated 會通知您包含物件之整體視覺化樹狀結構中的某個專案已變更,但配置細節 (大小、位置) 附加處理常式的物件可能尚未變更。
雖然此事件使用 RoutedEventHandler相關委派和 RoutedEventArgs衍生類別作為事件資料,但事件不是真正的路由事件。 它不會透過物件樹狀結構反升。 它只能在產生事件的專案上處理 (,換句話說,傳送者) 。 此事件之事件資料中的OriginalSource一律為Null,因此請勿嘗試使用OriginalSource。