在C# WPF應用程式中,Window
的生命週期是指視窗從建立到關閉的整個過程。理解WPF視窗的生命週期對於管理資源、事件處理以及進行效能最佳化等都至關重要。以下是WPF中視窗(Window
)生命週期的主要階段,以及在這些階段中可以使用的事件和方法。
1. 視窗的建立與初始化
當WPF視窗被建立時,系統會為視窗分配記憶體並進行初始化。此時,視窗的Window
類及其成員變數和控制元件的建構函式會被呼叫。視窗的視覺樹和邏輯樹也在此時開始構建。
-
建構函式 (
Window()
):- 在視窗建立時,
Window
的建構函式會被呼叫。通常,在建構函式中進行初始設定,如設定DataContext
、繫結等。 - 例如:
public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); }
- 在視窗建立時,
-
OnInitialized
事件:OnInitialized
事件在視窗初始化後、元素樹構建之前觸發。此時,所有控制元件和資料繫結已經準備好,但尚未進行繪製。通常,您可以在這裡進行一些初始化工作,如載入資料或設定介面狀態。- 示例:
protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); // 初始化邏輯 }
2. 視窗的載入與佈局
OnLoaded
事件:- 在視窗及其控制元件的視覺樹完成佈局並準備呈現時,
OnLoaded
事件會被觸發。此時,視窗的所有控制元件都已可見,您可以進行一些與佈局相關的操作,如調整控制元件的大小或位置。 - 例如:
protected override void OnLoaded(object sender, RoutedEventArgs e) { base.OnLoaded(e); // 進行一些與視窗載入相關的操作 }
- 在視窗及其控制元件的視覺樹完成佈局並準備呈現時,
3. 視窗的啟用與焦點
-
Activated
事件:- 當視窗從非活動狀態變為活動狀態時,
Activated
事件會被觸發。比如使用者點選視窗或使用Activate()
方法時會發生這種情況。 - 示例:
private void Window_Activated(object sender, EventArgs e) { // 當視窗被啟用時觸發 }
- 當視窗從非活動狀態變為活動狀態時,
-
Deactivated
事件:- 當視窗失去焦點或被最小化時,
Deactivated
事件會被觸發。
- 當視窗失去焦點或被最小化時,
4. 視窗的關閉
-
OnClosing
事件:- 當視窗即將關閉時,
OnClosing
事件會被觸發。此時可以取消視窗的關閉操作,或進行資源清理等操作。透過設定Cancel
屬性為true
,可以取消視窗的關閉事件。 - 示例:
protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); // 在此處可以進行視窗關閉前的清理工作 // e.Cancel = true; // 如果需要取消視窗關閉 }
- 當視窗即將關閉時,
-
OnClosed
事件:- 當視窗已經關閉時,
OnClosed
事件會被觸發。此時,您可以進行一些清理工作,如釋放資源或儲存狀態等。 - 示例:
protected override void OnClosed(EventArgs e) { base.OnClosed(e); // 視窗關閉後的資源清理 }
- 當視窗已經關閉時,
5. 視窗的生命週期總結
生命週期階段 | 事件/方法 | 描述 |
---|---|---|
視窗建立 | Window() 建構函式 |
建立視窗並初始化控制元件 |
視窗初始化 | OnInitialized |
初始化完成,所有控制元件和資料繫結已準備就緒 |
視窗載入 | OnLoaded |
視窗控制元件的佈局已完成,可以執行一些與佈局相關的操作 |
視窗啟用 | Activated |
當視窗變為活動時觸發 |
視窗失去焦點 | Deactivated |
當視窗失去焦點時觸發 |
視窗關閉 | OnClosing |
視窗即將關閉時觸發,可以取消視窗的關閉操作 |
視窗已關閉 | OnClosed |
視窗已關閉,可以在此進行資源清理等操作 |
6. 資源清理與垃圾回收
在OnClosed
事件中,您通常需要清理和釋放資源。例如,取消繫結、釋放檔案控制代碼、資料庫連線等。如果有非同步任務,最好在視窗關閉前完成它們,或顯式地取消它們。
7. 視窗生命週期的自定義擴充套件
有時,您可能需要在特定的生命週期事件中新增自定義邏輯。透過覆蓋OnInitialized
、OnLoaded
、OnClosing
和OnClosed
等方法,您可以控制視窗的建立、載入、關閉等過程。此外,您還可以使用ICommand
等模式將行為與UI分離。
透過理解這些生命週期事件,您可以更好地控制視窗的行為、資源管理以及使用者互動,避免資源洩漏和不必要的效能開銷。