【问题标题】:How to make a form close when pressing the escape key?按下退出键时如何关闭表单?
【发布时间】:2011-04-01 09:40:43
【问题描述】:

我有一个小窗体,当我在 Windows 窗体应用程序中按下按钮时会出现。

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

【问题讨论】:

标签: c# winforms


【解决方案1】:

如果您的表单上有一个取消按钮,您可以将 Form.CancelButton 属性设置为该按钮,然后按 Escape 将有效地“单击该按钮”。

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

【讨论】:

    【解决方案2】:

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

    将表单的CancelButton 属性设置为该按钮。

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

    如果您没有取消按钮,那么您需要添加 KeyDown 处理程序并检查其中的 Esc 键:

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

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

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

    然而,正如 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);
    }
    

    【讨论】:

    • 很遗憾,简单地添加隐藏按钮 (visible=true) 不起作用
    • 从处理的角度来看,为此添加一个隐藏按钮无论如何都是一个非常肮脏的解决方案,因为在任何一种情况下,表单都会在内部有一个关键的侦听器来使其发挥作用。无需为了调用链接到其 Clicked 侦听器的函数而制作不必要的按钮对象。
    • @SergeWautier 你是对的,但是 kkkppps 的回答是解决这个问题的方法
    • 是否有原因导致表单的 CancelButton 属性无法调用 FormClosing 事件或类似事件?
    【解决方案3】:
    Button cancelBTN = new Button();
    cancelBTN.Size = new Size(0, 0);
    cancelBTN.TabStop = false;
    this.Controls.Add(cancelBTN);
    this.CancelButton = cancelBTN;
    

    【讨论】:

    • 这个答案应该是正确答案。按钮是隐藏的,但“可见”属性不是“假”,这样它就像一个魅力。非常好!
    • 我不知道.. 看起来很“hacky”.. 就像回到了 vb6 时代。
    【解决方案4】:

    我发现最好的方法是覆盖“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);
    }
    

    【讨论】:

    • 我也发现这种方式是最好的方法,因为使用设置表单的取消按钮之类的解决方案会将关键事件发送到父表单,以防您当前的表单是子对话框表单,但此解决方案通过以下方式保护该错误表单关闭后返回 true 时完成关键流程。
    【解决方案5】:

    将此代码粘贴到表单的“On Key Down”属性中,同时确保将“Key Preview”属性设置为“Yes”。

    If KeyCode = vbKeyEscape Then DoCmd.Close acForm, "YOUR FORM NAME"
    

    【讨论】:

    • 这是 VBA 代码。问题是关于 c# 和 winforms。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2017-06-13
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多