退出表格 - 在“KeyUp”上使用“ProcessDialogKey”的优势

时间:2018-04-12 11:18:52

标签: c# winforms

要在按下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);
}

所以我想知道在第一组代码中是否有任何优势,因为第二组代码看起来更麻烦。

2 个答案:

答案 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属性。