物件存留期事件

更新:2007 年 11 月

本主題說明通知物件存留期當中建立、使用和解構各階段的特定 WPF 事件。

這個主題包含下列章節。

  • 必要條件
  • 物件存留期事件
  • 項目的通用存留期事件
  • 存留期事件應用程式模型項目
  • 相關主題

必要條件

本主題假設您已了解相依性屬性,知道如何使用 Windows Presentation Foundation (WPF) 類別上的現有相依性屬性,而且也閱讀過相依性屬性概觀主題。為了能夠跟隨本主題中的範例,您也應該了解可延伸標記語言 (XAML) (請參閱 XAML 概觀),並知道如何撰寫 WPF 應用程式。

物件存留期事件

Microsoft .NET Framework Managed 程式碼中的所有物件都會經歷類似的生命週期階段,即建立、使用和解構。許多物件也有發生在解構期間的最終化階段。WPF 物件 (更具體來說,是 WPF 識別為項目的視覺物件) 也有一組物件生命週期階段。WPF 程式設計和應用程式模型會將這些階段公開為一系列的事件。WPF 有四種主要的物件類型與存留期事件相關,分別是一般項目、視窗項目、巡覽裝載和應用程式物件。視窗和巡覽裝載也屬於較大的視覺物件 (項目) 群組。本主題說明所有項目通用的存留期事件,然後再介紹適用於應用程式定義、視窗或巡覽裝載的事件。

項目的通用存留期事件

任何 WPF 架構層級項目 (即衍生自 FrameworkElementFrameworkContentElement 的物件) 都有三個通用存留期事件:InitializedLoadedUnloaded

Initialized

Initialized 會先引發,這大致上相當於呼叫物件的建構函式來對它進行初始設定。由於事件會引發來回應初始設定,因此物件的所有屬性都確保能設定 (但像是動態資源或繫結等運算式用法則例外,這些會是未評估的運算式)。由於所有屬性都必須設定,因此標記中定義的巢狀項目引發的 Initialized 順序會是項目樹狀結構中最深層的項目最優先,然後是朝根部的父項目。此順序是因為父-子關係 (Parent-Child Relationship) 和內含項目都是屬性,因此父項目要等到填入屬性的子項目都完全初始設定後,才能報告完成初始設定。

當您撰寫回應 Initialized 事件的處理常式時,必須考慮到,項目樹狀結構 (無論是邏輯樹狀結構或視覺化樹狀結構) 中附加處理常式的位置前後的所有其他項目不一定都已建立,特別是父項目。成員變數可能為 null,或者資料來源尚未由基礎繫結填入 (即使在運算式層級)。

Loaded

Loaded 會接著引發。Loaded 事件會在最後呈現之前、但在配置系統已計算呈現需要的所有值之後引發。Loaded 需要包含項目的邏輯樹狀結構已完成,並連接到提供 HWND 和呈現介面的展示來源。.標準資料繫結 (繫結至本機來源,例如其他屬性或直接定義的資料來源) 將在 Loaded 之前發生。非同步資料繫結 (外部或動態來源) 可能會發生,但根據其非同步性質的定義,則不保證一定會發生。

引發 Loaded 事件的機制與 Initialized 不同。Initialized 事件是依個別項目引發,而沒有完整的項目樹狀結構直接協調。相對地,Loaded 事件則是透過整個項目樹狀結構 (具體來說,就是邏輯樹狀結構) 協調而引發。當樹狀結構中的所有項目都視為載入時,就會先在根項目上引發 Loaded 事件。接著會在後面的每個子項目上引發 Loaded 事件。

注意事項:

此行為在表面上可能類似路由事件的反昇。不過,事件之間不會傳遞資訊。每個項目都有機會處理其 Loaded 事件,而將事件資料標記為已處理對該項目以外並無作用。

Unloaded

Unloaded 會最後引發,而且是由展示來源或要移除的視覺父項目所啟始。引發和處理 Unloaded 時,事件來源父項目 (由 Parent 屬性決定) 或在邏輯或視覺化樹狀結構中上層的任何指定項目可能已經取消設定,表示資料繫結、資源參考和樣式可能未設成一般或最後已知的執行階段值。

存留期事件應用程式模型項目

項目以通用存留期事件為基礎的包括下列應用程式模型項目:ApplicationWindowPageNavigationWindowFrame。這些項目以與其特定用途相關的更多事件延伸了通用存留期事件。下列章節將詳細討論這些項目:

請參閱

概念

相依性屬性值優先順序

路由事件概觀