2014-01-06 59 views
11

我有一個WPF項目,我有一個自定義關閉邏輯窗口。我想要一些代碼在用戶關閉窗口時運行。我知道兩種方法來做到這一點,我想知道哪個更好:我應該使用Closing事件還是重寫OnClosing?

選項1)處理base.Closing事件。

選項2)重寫OnClosing方法。

下面是一些示例代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     base.Closing += this.MainWindow_Closing; 
    } 

    //Option 1 
    void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     //close logic here, or 
    } 

    //Option 2 
    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     //close logic here 

     base.OnClosing(e); 
    } 
} 

我可以在兩個選項之間找到唯一的區別是化妝品。我更喜歡選項2,因爲它對我來說看起來更清潔。我更喜歡重寫方法來處理事件。

這兩個選項之間還有其他區別嗎?我知道選項1提供給其他一些類來處理這個窗口的關閉事件。

編輯:我忘了提及我使用.Net 4.0。它看起來像.Net 4.5有一個OnFormClosing事件,不贊成OnClosing事件。我沒有使用OnFormClosing事件。

回答

14

主要區別在於您確定何時調用基本代碼的覆蓋。消耗事件時,您無法控制該事件。消耗事件時,實質上就是基本代碼。

有時候這是一個重要的區別,因爲如果有事件的消費者,但您需要在被調用之前做工作,那麼您需要覆蓋。

在這種情況下 - 可能不是一個很大的區別。

-1

當您覆蓋OnClosing時,您可以使用CancelEventArgs實現取消關閉的邏輯(請參閱MSDN)。另請參閱an example

如果發生事件,您只需在窗口關閉之前做一些工作,並且不會影響關閉過程。

+0

我還沒有發現,在我的測試是真實的。在這兩種情況下,該方法都有一個'System.ComponentModel.CancelEventArgs e'參數。如果我在任何一個選項的任何時候調用'e.Cancel = true;',當用戶單擊窗口右上角的紅色X時,窗口不會關閉。 – user2023861

6

一個聽着它的自己事件有點傻。然而,它是設計人員工作的方式,它們被編寫爲生成事件處理程序分配,而不是自動生成方法覆蓋。由於您沒有使用設計器並自己編寫事件處理函數,所以您絕對應該支持覆蓋。還有一件事你可以做錯,你不能忘記寫作業。

只有您(或其他程序員)從您的MainWindow類派生出類才真正重要。現在,你對如何編寫OnClosing()方法的選擇:

  • 的base.OnClosing()調用之前添加自定義代碼。你允許派生類改變你做出的決定。換句話說,對於這個事件,程序員可以強制e.Cancel回到false。這是正常的方式。

  • 請先調用base.OnClosing(),然後添加您的自定義代碼。這讓你無法控制派生類無法替代你的決定。當您的決定最重要和/或派生類無法正確覆蓋您的選擇時,您可以這樣做,也許是因爲只有您可以訪問私人信息。

  • 不調用base.OnClosing()。這可以防止派生代碼根本看不到事件。當你徹底改變事件處理時你會這樣做。例如,當您取消關閉並隱藏窗口時,此事件。

+2

我不知道爲什麼Window類沒有可覆蓋的OnLoaded方法。如果我想在加載Window時運行一些代碼,那麼我必須使用Loaded事件,即使這意味着我的類正在監聽自己。我不能總是把這段代碼放在構造函數中,因爲構造函數每個實例只發生一次,而Load事件發生的次數是零次或多次。 – user2023861

相關問題