我正在处理一个MDI
winforms项目,我想用户使用F3快捷方式在应用程序中的每个位置打开搜索表单,所以我在MDI
父窗体中使用以下代码,并将父窗体的KeyPreview
设置为true
:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.F3)) {
//Show search form
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
快捷方式适用于MDI
父窗体和子窗体,但是如果我使用.ShowDialog()
从MDI
子窗体之一打开窗体,则该快捷方式在最后一个窗体中不起作用,换句话说,快捷方式在childForm
中起作用:
//in the parent form
var childForm = new Form1();
childForm.MdiParent = parentForm;
childForm.KeyPreview = true;
childForm.Show();
但不能以grandChildForm
形式工作:
//in the child form
var grandChildForm = new Form2();
grandChildForm.KeyPreview = true;
grandChildForm.ShowDialog();
如何在不以所有形式重复ProcessCmdKey()
方法的情况下解决问题?
创建一个baseForm
:
public partial class baseForm : Form
{
public baseForm()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.F3))
{
//Show search form
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
并让所有其他表单继承自它:
public partial class Form1 : baseForm
然后,可以将所需的任何常用功能添加到baseForm中。