首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 視窗關閉事件中隱藏而非關閉的正確做法

     編輯:關於.NET

問題背景

在 WPF 中,若於 Closing 事件內設定 e.Cancel = true 並直接呼叫 Hide(),會拋出異常:「當 Window Closing 時不能設置 Visibility,或調用 Show/Close/Hide 方法」。這是因為視窗正處於關閉流程中,無法立即切換可見狀態。

解決思路:利用 Dispatcher 延遲執行

關鍵在於「排隊」:在 Closing 取消關閉後,透過 Dispatcher.BeginInvoke 將 Hide 推送到 UI 執行緒的下一個優先順序,待關閉流程結束再執行隱藏。

實作步驟

  1. 定義一個委派指向隱藏邏輯。
  2. 於 Closing 事件中 e.Cancel = true 並 BeginInvoke 該委派。

程式碼範例

public partial class MainWindow : Window
{
    private delegate void WillHide();
    private WillHide _hideDelegate;
    private SecondaryWindow _win2 = new SecondaryWindow();

    public MainWindow()
    {
        InitializeComponent();
        _hideDelegate = new WillHide(HideWin2);
        _win2.Closing += Win2_Closing;
        btnShowWin2.Click += (s, e) => _win2.Show();
        _win2.Show();
    }

    private void HideWin2() => _win2.Hide();

    private void Win2_Closing(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, _hideDelegate);
    }
}

此模式同樣適用於需在關閉時執行其他 UI 操作(如動畫、確認對話框)的情境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved