2014-04-23 20 views
-2

我不知道爲什麼,但是當我調用窗體上的close()方法時,它會自動調用Window_Closing()方法,但是爲什麼?爲什麼關閉表單調用Window_Closing()方法?

我追溯了代碼,實際上它會自動調用它,但我不確定。代碼

相關片段(從叫做Visual C#2010分步書):

namespace BellRingers 
{ 
    public partial class MainWindow : Window 
    { 
     private string[] towers = { "Great Shevington", "Little Mudford", 
             "Upper Gumtree", "Downley Hatch" }; 
     private string[] ringingMethods = { "Plain Bob", "Reverse Canterbury", 
              "Grandsire", "Stedman", "Kent Treble Bob", "Old Oxford Delight", 
              "Winchendon Place", "Norwich Surprise", "Crayford Little Court"}; 



     private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 
      MessageBoxResult key = MessageBox.Show("Are you sure you want to quit", 
       "Confirm", 
       MessageBoxButton.YesNo, 
       MessageBoxImage.Question, 
       MessageBoxResult.No); 
      e.Cancel = (key == MessageBoxResult.No); 
     } 

     private void exit_Click(object sender, RoutedEventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 
+3

好吧,這是'Window_Closing'方法的用途。無論如何,在窗口關閉時調用。 –

+0

當你調用'Close'方法時,它會增加'OnClosing'事件,然後'OnClosed'。這是打算。你可以做的是當用戶關閉或退出按鈕時,添加一些'bool'標誌來檢查'Closing'(或者看看'e.CloseReason')。 – Sinatr

+2

你的期望是什麼?爲什麼? 「窗口」是......「關閉」。 –

回答

1

那麼這是什麼關閉是有。只要在表單上調用Close()方法,框架就會引發Closing事件。

MSDN中的以下代碼段說明什麼時候關閉以及什麼時候關閉。

從MSDN:

關閉可以被處理時被關閉一個窗口以檢測(例如,關閉時被調用)。此外,關閉可用於防止關閉窗口。要阻止窗口關閉,可以將CancelEventArgs參數的Cancel屬性設置爲true。

當調用Close時,如果單擊窗口的Close按鈕,或者如果用戶按下Alt + F4,則會引發Closing事件。

如果一個擁有的窗口使用Show在其所有者窗口中打開,並且所有者窗口關閉,則不會引發擁有的窗口的Closing事件。如果窗口的所有者關閉(請參閱所有者),則在擁有的窗口上不會引發關閉。

如果調用Shutdown,則會引發每個窗口的Closing事件。但是,如果關閉取消,取消將被忽略。

如果會話因用戶註銷或關閉而結束,則不會引發關閉;處理SessionEnding以實現取消應用程序關閉的代碼。

如果您希望在應用程序的生命週期中多次顯示和隱藏窗口,並且每次顯示窗口時都不希望重新實例化窗口,則可以處理Closing事件,取消它並調用隱藏方法。然後,您可以在同一個實例上調用Show來重新打開它。

+0

感謝您的解釋。我不太清楚,這是一種自動調用的內置方法。 – standbyfor

+0

@standbyfor你誤會了 - 這不是一個內置的方法,它是一個內置的事件。你自己編寫事件處理程序,而'Window'類執行給定事件的所有事件處理程序,在你的情況下,'Closing'。看看事件是什麼,這是一個非常有用的概念。 – Luaan

0

嗯,這是Closing事件的關鍵所在。如果您正在討論將接線方式分配給相關事件的接線位置,那通常會在表單設計器中進行。儘管我確實知道事件可以通過例如名稱自動綁定。 ASP.NET,所以如果沒有手動綁定事件,那可能是它已經根據名稱綁定了。

雖然它很可能在設計師身上。

+0

就是這樣,我不確定何時以及如何綁定。有沒有什麼hiearchy或什麼的。 – standbyfor