C# WPF 生命週期

多见多闻發表於2024-11-21

在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. 視窗生命週期的自定義擴充套件

有時,您可能需要在特定的生命週期事件中新增自定義邏輯。透過覆蓋OnInitializedOnLoadedOnClosingOnClosed等方法,您可以控制視窗的建立、載入、關閉等過程。此外,您還可以使用ICommand等模式將行為與UI分離。

透過理解這些生命週期事件,您可以更好地控制視窗的行為、資源管理以及使用者互動,避免資源洩漏和不必要的效能開銷。