如何在Winforms中使用ESC键关闭对话框?

23

现在使用软件时,经常按ESC键可以关闭对话框而不保存任何我所做的更改。我尤其喜欢这一点,因为即使对话框上有取消按钮,我也不一定想去找鼠标或者通过Tab键到达取消按钮。这是一种很好的方式向软件表达“哎呀,不是故意的!”实际上,我发现如果软件没有实现这个功能,我会感到很烦,而且我不能相信Winforms的底层没有这样做-在我看来,这应该很直观...

我已经尝试过挂钩Form KeyPress事件或尝试模拟“取消”DialogResult等方式。似乎有多种方法可以解决这个问题...

因此,问题是:最干净的方法是什么,可以将ESC键绑定到关闭对话框而不保存任何更改?

非常感谢有经验的人提供任何帮助!

6个回答

33

将表单的CancelButton属性设置为引用您的取消按钮。


7
还有一个相应的“AcceptButton”用于回车键。这种答案方法的优点是除了按键之外,还有更多钩子可以挂接回车和取消 - 使用此方法还将在按钮上呈现正确的视觉提示(例如,“AcceptButton”会获得更粗的边框)。 - stusmith
6
别忘了同时设置你的取消和确认按钮的DialogResult属性。 - NascarEd
1
另外,不要将您的按钮命名为“CancelButton”。它将无法与CancelButton属性正常工作,并且会悄悄地失败。 - bruestle2
1
@bruestle2,非常感谢您的评论!我一直在尝试弄清楚为什么这在我的代码中不起作用,原来是因为我的按钮被命名为“CancelButton”!我从未想过要检查它! - Dennis Jones
另外请注意,取消按钮需要可见,否则它将无法工作。我以为我可以隐藏按钮并获得相同的效果...但不行。 - PandaWood

12

如果没有取消按钮,您可以重写processcmdkey来实现此操作:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if (keyData == Keys.Escape)
  {
    this.Close();
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

3
هœ¨و‚¨çڑ„ن»£ç پè،Œthis.Close();ن¹‹ه‰چوڈ’ه…¥DialogResult = DialogResult.Cancel;هچ³هڈ¯م€‚ - Uwe Keim

6
您还可以将表单的CancelButton属性设置为取消按钮:
this.CancelButton = this.cancelButton;

在Visual Studio中,您可以通过表单的属性设置来实现此操作,代码会添加到Form.Designer.cs文件中。

2
你可以这样做:
button b = new button();
b.click = button_click;
this.cancelbutton = b;


protected void button_click(object sender,eventargs e)
{
    this.close();
}

1
在一定程度上,这取决于您的开发环境 - 在.NET中它是内置的(就像在vb.old中一样),表单具有“取消按钮”属性,“如果设置了此属性,则每当用户按下'ESC'键时,该按钮将被'点击'。”
对于“ENTER”键,有相应的“AcceptButton”属性。
从记忆中,标准消息和对话框框默认会遵循上述逻辑 - 尽管当您不希望发生任何事情而用户没有积极断言他们想要做的事情时,可以指定消息框的默认按钮。

0
    If e.KeyCode = Keys.Escape Then
        If MsgBox("Are you sure to exit system (Y/N) ?", MsgBoxStyle.YesNo + MsgBoxStyle.Question) = MsgBoxResult.No Then Exit Sub
        dashboard.Close()

    ElseIf e.KeyCode = Keys.F5 Then
        MessageBox.Show("F5")
    End If

大家可以试试这个。这是为了在关闭窗体之前显示一个确认“是”或“否”的消息框。您可以将此代码添加到窗体内部的名为KeyDown的事件中。这里,“dashboard”是要关闭的窗体的名称。此代码将显示一个带有“是”或“否”按钮的消息框。如果您选择“是”,则会关闭您的窗体。如果您选择“否”,则操作将被取消。窗体保持不变。


1
请在您的答案中添加一些解释。 :) - Ataur Rahman Munna
可以将以下代码添加到表单中的“KeyDown”事件中。这里,“dashboard”是要关闭的表单的名称。此代码将显示一个带有“是”或“否”按钮的消息框。如果您选择“是”,则会关闭您的表单。如果您选择“否”,则操作将被取消。表单保持不变。 - Prakash
这是注释部分,不是用于回答的区域。请点击编辑链接并添加您的解释以及更新您的答案。 - Ataur Rahman Munna
好的。我是新来的这个网站...所以有点困惑。 - Prakash
非常感谢你。 - Prakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接