为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
FFIVE 2021-04-11 08:43:33
要在按下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 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

通常,它们在技术上有所不同(按照执行顺序),但是它们会做相同的事情。您不必对此过于谨慎。


我会使用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工作。


查看完整回答
反对 回复 2021-04-17
?
Helenr

TA贡献1780条经验 获得超4个赞

只是为了扮演魔鬼的拥护者,人们可能会争辩说两者都不适合此功能,因为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属性。


查看完整回答
反对 回复 2021-04-17
  • 2 回答
  • 0 关注
  • 408 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信