2013-01-23 52 views
2

我想表明,當用戶試圖關閉應用程序(紅窗交叉和按鈕的窗體上),但是當關閉Windows對話框對話框,此對話框擋住了關機,所以我想要在Windows關閉時進行檢測,並在沒有對話的情況下繼續進行。這裏是我的代碼在CloseReason.UserClosing形式展示了近2倍

後形式負載林捕關閉事件:

this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     switch (e.CloseReason) 
     { 
      case CloseReason.UserClosing: 
       if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No) 
        { 
         e.Cancel = true; 
        } 
       break; 
      case CloseReason.WindowsShutDown: 
       e.Cancel = false; //this is propably dumb 
       break; 
      default: 
       break; 
     } 
    } 

但是,當用戶關閉應用程序,對話框如圖2所示。第一個對話框,dotn做任何事情,在第二個對話框之後採取行動 如何在Windows關閉時顯示僅關閉一次而沒有對話框的對話框(因爲Windows正在等待我的應用程序關閉)?

+2

檢查調用堆棧,看看那裏的關閉()調用的來源。或者確保你沒有訂閱過這個活動兩次? –

+0

我試圖調試它,但它只是剛剛只需點擊yes或no在對話框 – miky

+4

嘗試註釋掉你'this.FormClosing + =新...'代碼後燒製的第二時間。您可能已經通過設計人員訂閱了它(或者只是檢查設計器文件)。 – LarsTech

回答

4

更好的方式來寫這個代碼(我認爲)是不同意的形式事件,而是利用現有的覆蓋方法:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    switch (e.CloseReason) 
    { 
    case CloseReason.UserClosing: 
     if (MessageBox.Show("Do you want to exit the application?", "Your App", MessageBoxButtons.YesNo) == DialogResult.No) 
     { 
     e.Cancel = true; 
     } 
     break; 
    case CloseReason.WindowsShutDown: 
     e.Cancel = false; //this is propably dumb 
     break; 
    default: 
     break; 
    } 

    base.OnFormClosing(e); 
} 

你可能要考慮使用只是一個if (e.CloseReason == CloseReason.UserClosing),而不是switch語句基於它的當前形式。默認情況下,e.Cancel已經是False,因此您不需要對其進行快速設置。

+0

'私人重寫'可能不是你的意思,一般來說,當重寫一個虛擬函數時,你也應該調用基本方法。 – hvd

+0

@ hvd是的,正在編輯所有。 – LarsTech

+2

避免使它成爲意見。這是一個事實,重寫OnFormClosing()是這樣做的正確方法;) –