您好,我正在修改WinForms程序。我希望可以按Esc键退出任何形式。
我试图将事件绑定到此方法,并且它起作用。
private void form_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Escape)
{
this.Dispose();
}
}
但是我想将此事件应用于项目中的许多表单,有什么聪明的方法来避免粘贴此方法并将其手动绑定到每个表单的事件?
答案 0 :(得分:2)
您可以使用装饰器模式,例如:
class CustomForm : Form
{
public CustomForm()
{
// automatically bind a keypress event
this.KeyPress += new EventHandler(form_KeyPress);
}
private void form_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Escape)
{
this.Close(); // Close instead of disposing
}
}
}
然后,您希望具有此行为的所有表单都可以继承自CustomForm
而不是Form
答案 1 :(得分:1)
您应该通过调用ProcessCommandKey
而不是Form
来覆盖Close()
基类的Dispose()
方法,因为调用dispose不是一个好习惯:
public partial class EscapableForm
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch ( keyData )
{
case Keys.Escape:
Close();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
在这里重写方法比使用事件更好,因为它允许更好的设计一致性。
因此,无论用户位于何处,无论处于活动状态如何,都可以捕获键,并且您可以管理所需的内容。您还可以添加任何UX条件,例如AllowClose
条件变量。
为了不重复代码,您可以创建自定义表单类文件,并以@Cid建议的任何最终形式替换Visual STudio Designer使用的标准Form基类。