2010-08-19 11 views
50

Ich habe ein kleines Formular, das kommt, wenn ich einen Knopf in einer Windows Forms Anwendung drücke.Wie wird ein Formular geschlossen, wenn die Escape-Taste gedrückt wird?

Ich möchte in der Lage sein, das Formular zu schließen, indem Sie die Escape-Taste drücken. Wie könnte ich das tun? Ich bin mir nicht sicher, welches Ereignis verwendet werden soll (form_closing?).

+1

Für alternative Lösung sehen Hans Passant Antwort auf diesen Thread: http://stackoverflow.com/questions/2290959/escape-button-to-close-winform-in-c-sharp – RenniePet

Antwort

94

Sie können eine Eigenschaft auf dem Formular festlegen, um dies für Sie zu tun, wenn Sie eine Schaltfläche in dem Formular haben, das das Formular bereits schließt.

Setzen Sie die Eigenschaft CancelButton des Formulars auf diese Schaltfläche.

Ruft die Tastensteuerung, die angeklickt wird, wenn der Benutzer die Esc Taste drückt.

Wenn Sie nicht über eine Schaltfläche Abbrechen haben dann müssen Sie einen KeyDown Handler hinzufügen und überprüfen Sie die Esc-Taste, dass:

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

Sie werden auch die KeyPreview Eigenschaft müssen um wahr zu sein.

Ruft einen Wert ab, der angibt, ob das Formular Schlüsselereignisse empfängt, bevor das Ereignis an das Steuerelement mit Fokus übergeben wird, oder legt diesen fest.

Doch wie Gargo in seinem answer weist darauf hin, bedeutet dies, dass Esc Drücken bearbeitet auf einer Steuerung im Dialog abzubrechen hat auch die Wirkung, den Dialog zu schließen. Um zu vermeiden, dass die ProcessDialogKey Methode überschreibt, wie folgt:

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

Es ist eine Schande, dass Das Hinzufügen einer versteckten Schaltfläche (visible = true) funktioniert nicht –

+2

Aus einer Verarbeitungsperspektive wäre das Hinzufügen einer ausgeblendeten Schaltfläche sowieso eine wirklich schmutzige Lösung, da in beiden Fällen das Formular intern über einen Schlüssel-Listener verfügt Funktion. Es ist nicht nötig, ein unnötiges Schaltflächenobjekt zu erstellen, nur um die Funktion aufzurufen, die mit seinem angeklickten Listener verknüpft ist. – Nyerguds

5

Wenn Sie eine Schaltfläche zum Abbrechen in Ihrem Formular haben, können Sie die Form.CancelButton -Eigenschaft auf diese Schaltfläche festlegen und dann durch Drücken von Escape wird 'klicken Sie auf die Schaltfläche'.

Wenn Sie keine solche Schaltfläche haben, überprüfen Sie die Form.KeyPreview Eigenschaft.

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

Die beste Weise, die ich gefunden ist, die „ProcessDialogKey“ Funktion außer Kraft zu setzen. Auf diese Weise ist das Abbrechen einer geöffneten Steuerung weiterhin möglich, da die Funktion nur aufgerufen wird, wenn keine andere Steuerung die gedrückte Taste verwendet.

Dies ist das gleiche Verhalten wie beim Festlegen eines CancelButton. Wenn das KeyDown-Ereignis immer ausgelöst wird, wird das Formular geschlossen, auch wenn es die Bearbeitung eines geöffneten Editors abbrechen sollte.

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

Ich fand auch so die beste Methode, weil die Verwendung von Lösungen wie Abbrechen der Schaltfläche Abbrechen Formular Schlüsselereignis an übergeordnete Formulare senden, falls Ihr aktuelles Formular ein untergeordnetes Dialogfeld ist, aber diese Lösung schützt diesen Fehler durch Beenden von Schlüsselprozessen bei der Rückgabe von True nach Formular schließen. –

Verwandte Themen