要在按下ESC时关闭表单,我一直使用:
protected override bool ProcessDialogKey(Keys keyData) //Exit form if Esc is pressed
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
//Define a messagebox
const string message = "Are you sure that you want to exit the application?";
const string caption = "Close Application";
var result = MessageBox.Show(message, caption,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
//Cancel the action if NO is clicked
e.Cancel = (result == DialogResult.No);
}
今天,我意识到使用以下代码可以实现同样的目标:
private void frmMain_KeyUp(object sender, KeyEventArgs e)
{
//Close form when ESC key is pressed
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
//Define a messagebox
const string message = "Are you sure that you want to exit the application?";
const string caption = "Close Application";
var result = MessageBox.Show(message, caption,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
//Cancel the action if NO is clicked
e.Cancel = (result == DialogResult.No);
}
所以我想知道在第一组代码中是否有任何优势,因为第二组代码看起来更麻烦。
答案 0 :(得分:3)
一般来说,它们在技术上是不同的(按照执行的顺序),但它们会做同样的事情。你不需要过于谨慎。
我使用ProcessDialogKey
因为即使像TextBox
这样的控件包含焦点,ProcessDialogKey
的{{1}}也会运行,而在这种情况下{仅当您将表单的Form
设置为KeyDown
时,KeyUp
的{1}}或Form
才会提升。
所以这是我将使用的代码:
KeyPreview
它similar的工作方式CancelButton
安静{/ 3}。
答案 1 :(得分:1)
只是为了玩devil's advocate,有人可能会认为这两种方法都不合适,因为Form Class会为此目的公开Form.CancelButton Property。
获取或设置用户按下ESC键时单击的按钮控件。
此属性的类型为IButtonControl
。因此,Form本身可以实现该接口并充当其自己的CancelButton
。
public partial class Form1 : Form, IButtonControl
{
public Form1()
{
InitializeComponent();
CancelButton = this;
}
DialogResult IButtonControl.DialogResult
{
get {return DialogResult.OK;}
set {}
}
void IButtonControl.NotifyDefault(bool value) { }
void IButtonControl.PerformClick()
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
当然,如果表单呈现实际的CancelButton,则应将其分配给Form.CancelButton属性。