2010-08-19 84 views
50

我有一個小表格,當我按下Windows Forms應用程序中的按鈕時會彈出一個小表格。如何在按下退出鍵時關閉窗體?

我希望能夠按下退出鍵來關閉窗體。我怎麼能這樣做?我不確定要使用的事件(form_closing?)?

+1

對於替代解決方案見漢斯帕桑特對這個主題的答案: http://stackoverflow.com/questions/2290959/escape-button-to-close-winform-in-c-sharp – RenniePet 2012-04-13 02:30:43

回答

94

如果窗體上已經有一個關閉窗體的按鈕,您可以在窗體上設置一個屬性來爲您執行此操作。

將表單的CancelButton屬性設置爲該按鈕。

獲取或設置當用戶按下Esc鍵密鑰點擊按鈕控制。

如果沒有一個取消按鈕,那麼你就需要添加一個KeyDown處理程序,並檢查該Esc鍵:

private void Form_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Escape) 
    { 
     this.Close(); 
    } 
} 

您還必須設置KeyPreview屬性爲真。

獲取或設置一個值,該值指示表單在將事件傳遞給具有焦點的控件之前是否接收關鍵事件。

然而,隨着Gargo在他answer指出,這將意味着,按Esc鍵中止在對話框中控制的編輯也將關閉該對話框的效果。爲了避免覆蓋ProcessDialogKey方法如下:

protected override bool ProcessDialogKey(Keys keyData) 
{ 
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) 
    { 
     this.Close(); 
     return true; 
    } 
    return base.ProcessDialogKey(keyData); 
} 
+0

這是一個恥辱,簡單地添加一個隱藏的按鈕(visible = true)不起作用 – 2012-09-20 15:48:05

+2

從處理的角度來看,爲此添加一個隱藏按鈕將是一個非常骯髒的解決方案,因爲無論哪種情況,表單都會在內部有一個關鍵偵聽器功能。不需要製作不必要的按鈕對象來調用鏈接到其Clicked偵聽器的函數。 – Nyerguds 2013-01-02 10:13:37

5

如果您的表單上有一個取消按鈕,您可以將Form.CancelButton屬性設置爲該按鈕,然後按下轉義將有效地「單擊按鈕」。

如果您沒有這樣的按鈕,請檢查Form.KeyPreview屬性。

-2
Button cancelBTN = new Button(); 
cancelBTN.Size = new Size(0, 0); 
cancelBTN.TabStop = false; 
this.Controls.Add(cancelBTN); 
this.CancelButton = cancelBTN; 
23

我發現最好的辦法是重寫「ProcessDialogKey」功能。通過這種方式,取消打開的控件仍然是可能的,因爲僅當沒有其他控件使用按下的鍵時纔會調用該功能。

這與設置CancelButton時的行爲相同。使用KeyDown事件始終觸發,因此即使在取消編輯打開的編輯器時,表單也會關閉。

protected override bool ProcessDialogKey(Keys keyData) 
{ 
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) 
    { 
     this.Close(); 
     return true; 
    } 
    return base.ProcessDialogKey(keyData); 
} 
+2

我也發現這種方法是最好的方法,因爲使用諸如設置窗體的取消按鈕之類的解決方案將關鍵事件發送到父窗體,以防當前窗體是子窗體對話框,但是此解決方案通過完成關鍵過程來保護該錯誤形成緊密。 – 2015-12-11 11:59:34

相關問題