退出表单-使用“ ProcessDialogKey”而不是“ KeyUp”的优势

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

}

因此,我想知道遵循第一组代码是否有任何优势,因为第二组代码似乎更轻松。


FFIVE
浏览 409回答 2
2回答

慕莱坞森

通常,它们在技术上有所不同(按照执行顺序),但是它们会做相同的事情。您不必对此过于谨慎。我会使用ProcessDialogKey,因为即使像控制TextBox包含焦点,ProcessDialogKey的Form运行,而在这种情况下,KeyDown或KeyUp的Form将只提出如果设置KeyPreview在表格中true。因此,这是我将使用的代码:protected override bool ProcessDialogKey(Keys keyData){    if (keyData == Keys.Escape)    {        this.Close();        return true;    }    return base.ProcessDialogKey(keyData);}它是安静的相似到的方式CancelButton工作。

Helenr

只是为了扮演魔鬼的拥护者,人们可能会争辩说两者都不适合此功能,因为Form类为此公开了Form.CancelButton属性。获取或设置用户按下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属性。
打开App,查看更多内容
随时随地看视频慕课网APP