按退出键时如何关闭表单?

Gur*_*epS 61 c# winforms

我有一个小表单,当我按下Windows窗体应用程序中的按钮时出现.

我希望能够通过按退出键关闭表单.我怎么能这样做?我不确定要使用的事件(form_closing?)?

Chr*_*isF 112

如果表单上有一个关闭表单的按钮,您可以在表单上设置一个属性来为您执行此操作.

CancelButton窗体的属性设置为该按钮.

获取或设置用户按下Esc键时单击的按钮控件.

如果你没有取消按钮,那么你需要添加一个KeyDown处理程序并检查Esc键:

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

您还必须将该KeyPreview属性设置为true.

获取或设置一个值,该值指示在将事件传递给具有焦点的控件之前表单是否将接收键事件.

但是,正如Gargo在他的回答中指出的那样,这意味着按下Esc以中止对话框中控件的编辑也会产生关闭对话框的效果.为避免重写ProcessDialogKey方法,如下所示:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}
Run Code Online (Sandbox Code Playgroud)

  • 从处理的角度来看,为此添加隐藏按钮无论如何都是一个非常脏的解决方案,因为在任何一种情况下,表单都将在内部具有一个键侦听器以使其起作用.无需仅仅为了调用链接到其Clicked侦听器的函数而创建不必要的按钮对象. (3认同)
  • 很遗憾,简单地添加一个隐藏按钮(visible=true)不起作用 (2认同)

小智 25

我发现的最好方法是覆盖"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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我也发现这种方法是最好的方法,因为使用设置表单的取消按钮等解决方案会将关键事件发送到父表单,以防当前表单是子对话框表单,但是此解决方案通过在表单后返回true时完成关键进程来保护错误关. (3认同)

Wil*_*l A 6

如果表单上有取消按钮,则可以将Form.CancelButton属性设置为该按钮,然后按下escape将有效地"单击按钮".

如果您没有这样的按钮,请查看Form.KeyPreview属性.


小智 5

Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;
Run Code Online (Sandbox Code Playgroud)

  • 我不知道..看起来很“hacky”..就像回到了vb6时代。 (3认同)