2010-08-19 10 views
50

J'ai une petite forme, qui apparaît lorsque j'appuie sur un bouton dans une application Windows Forms.Comment fermer un formulaire en appuyant sur la touche d'échappement?

Je veux être en mesure de fermer le formulaire en appuyant sur la touche d'échappement. Comment pourrais-je faire ça? Je ne suis pas sûr de l'événement à utiliser (form_closing?)?

+1

solution de rechange pour voir la réponse de Hans sur ce fil Passant: http://stackoverflow.com/questions/2290959/escape-button-to-close-winform-in-c-sharp – RenniePet

Répondre

94

Vous pouvez définir une propriété sur le formulaire pour le faire pour vous si vous avez déjà un bouton sur le formulaire qui ferme le formulaire.

Définissez la propriété CancelButton du formulaire sur ce bouton.

Obtient ou définit le contrôle de bouton qui est cliqué lorsque l'utilisateur appuie sur la touche Echap .

Si vous n'avez pas alors un bouton d'annulation, vous aurez besoin d'ajouter un gestionnaire KeyDown et vérifiez la touche Echap en ce que:

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

Vous aurez également définir la propriété KeyPreview à vrai.

Obtient ou définit une valeur indiquant si le formulaire recevra des événements de clé avant que l'événement soit transmis au contrôle qui a le focus.

Cependant, comme Gargo souligne dans son answer cela signifie qu'en appuyant sur Echap pour annuler une modification sur un contrôle dans la boîte de dialogue aura également pour effet de fermer la boîte de dialogue. Pour éviter que remplacer la méthode ProcessDialogKey comme suit:

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

Il est dommage que ajouter simplement un bouton caché (visible = true) ne fonctionne pas –

+2

Du point de vue du traitement, ajouter un bouton caché pour cela serait une solution vraiment sale, puisque dans les deux cas, le formulaire aura en interne un écouteur de touche pour le rendre fonction. Pas besoin d'aller faire un objet bouton inutile juste pour appeler la fonction liée à son écouteur cliqué. – Nyerguds

5

Si vous avez un bouton d'annulation sur votre formulaire, vous pouvez définir la propriété Form.CancelButton à ce bouton, puis en appuyant sur échappement sera effectivement «cliquez sur le bouton».

Si vous ne disposez pas d'un tel bouton, consultez la propriété 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 meilleure façon que j'ai trouvé est de remplacer la fonction « ProcessDialogKey ». De cette façon, l'annulation d'un contrôle ouvert est toujours possible car la fonction n'est appelée que si aucun autre contrôle n'utilise la touche enfoncée.

Ceci est le même comportement que lors de la définition d'un CancelButton. L'utilisation de l'événement KeyDown se déclenche toujours et donc le formulaire se ferme même s'il doit annuler l'édition d'un éditeur ouvert.

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

J'ai aussi trouvé la meilleure méthode car l'utilisation de solutions telles que le bouton cancel du formulaire enverra un événement clé aux formulaires parents si votre formulaire actuel est un formulaire enfant, mais cette solution protège cette erreur en terminant les processus clés forme proche. –

Questions connexes