2009-02-20 147 views
41

我有一個WPF窗口,我從另一個窗口創建,show()ing,然後讓它關閉()本身。當窗口關閉時,我期望它死亡,調用它的構造函數,並刪除它的所有子元素(如定時器..)。處理WPF窗口的正確方法是什麼?

調用這種動作的正確方法是什麼?

回答

52

Close()發佈所有非託管資源,並關閉所有擁有的Window s。

您需要確定性處理的任何其他託管資源應該從Closed事件中處理。

Reference

(注:刪除以前的答案,這是一個完全錯誤的猜測)

+1

WPF中的Window類沒有Dispose()方法! – 2009-02-24 09:27:58

+6

也許我應該先閱讀文檔? – 2009-02-25 01:07:27

11

有實際需要在Windows窗體中明確佈置,不像很少WPF元素。

在Window的情況下,調用Close()足以根據documentation處理所有託管和非託管資源。

+3

我的文檔說只有非託管資源處置... – 2009-02-25 01:13:12

1

關閉窗口並確信已釋放所有資源給它及其任何子項會導致邏輯樹中所有表現良好的元素被垃圾收集。

我說「行爲良好」,因爲從理論上講,有一個元素可以做一些事情,比如創建一個不能正常停止的線程,但實際上如果你使用的是基本的WPF框架和寫得很好的控件,那麼你應該可以放開一切。

6

爲了以防萬一,我會補充我的兩分錢。

我的問題是,我沒有做足夠的故障排除。我的窗戶是可以打開一個子窗口,關閉,重開,所以我增加了以下,以保持其完全關閉:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

然而,當Window.Close是所謂的,它只是躲到窗口。我終於抓獲,並添加以下內容:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

public void Close() { 
    this.Closing -= Window_Closing; 
    //Add closing logic here. 
    base.Close(); 
} 

這工作得很好 - 它移除了事件處理程序防止被關閉的窗口,然後將其關閉。

相關問題