2010-08-19 85 views
50

Tengo un formulario pequeño, que aparece cuando presiono un botón en una aplicación Windows Forms.¿Cómo cerrar un formulario al presionar la tecla de escape?

Quiero ser capaz de cerrar el formulario presionando la tecla Escape. ¿Cómo podría hacer esto? No estoy seguro del evento para usar (form_closing?)?

+1

solución alternativa Para ver la respuesta de Hans Passant sobre este tema: http://stackoverflow.com/questions/2290959/escape-button-to-close-winform-in-c-sharp – RenniePet

Respuesta

94

Puede establecer una propiedad en el formulario para hacer esto por usted si ya tiene un botón en el formulario que cierra el formulario.

Establezca la propiedad CancelButton del formulario en ese botón.

Obtiene o establece el control de botón que se hace clic cuando el usuario presiona la tecla Esc .

Si usted no tiene un botón de cancelación, entonces tendrá que añadir un manejador KeyDown y comprobar si la tecla Esc en la que:

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

También tendrá que establecer la propiedad KeyPreview a verdad

Obtiene o establece un valor que indica si el formulario recibirá eventos clave antes de pasar el evento al control que tiene el foco.

Sin embargo, como señala en su Gargo answer esto significará que al pulsar Esc para abortar una edición en un control en el cuadro de diálogo también tendrá el efecto de cerrar el cuadro de diálogo. Para evitar que reemplazar el método ProcessDialogKey como sigue:

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

Es una pena que simplemente agregar un botón oculto (visible = verdadero) no funciona –

+2

Desde una perspectiva de procesamiento, agregar un botón oculto para esto sería una solución realmente sucia de todos modos, ya que en cualquier caso, el formulario tendrá un oyente de clave internamente para hacerlo función. No es necesario crear un objeto de botón innecesario solo para llamar a la función vinculada a su oyente Clicked. – Nyerguds

5

Si tiene un botón de cancelar en su formulario, puede establecer la propiedad Form.CancelButton en ese botón y luego presionar Escape efectivamente 'hará clic en el botón'.

Si no tiene este botón, consulte la propiedad Form.KeyPreview.

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

La mejor manera que he encontrado es para anular la función "ProcessDialogKey". De esta forma, la cancelación de un control abierto sigue siendo posible porque la función solo se invoca cuando ningún otro control utiliza la tecla presionada.

Este es el mismo comportamiento que cuando se establece un CancelButton. El uso del evento KeyDown se activa siempre y, por lo tanto, el formulario se cerrará incluso cuando deba cancelar la edición de un editor abierto.

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

También encontré de esta manera el mejor método porque al usar soluciones como configurar el botón cancelar enviará evento clave a formularios primarios en caso de que su formulario actual sea un formulario de diálogo secundario, pero esta solución protege ese error finalizando procesos clave cuando se devuelve verdadero después forma cerca. –

Cuestiones relacionadas