基本问题是在调用 Close 时会调用表单的 Dispose 方法,因此表单将要关闭,您对此无能为力。
我会通过让 UserControl 实现一个标记接口来解决这个问题,比如 ISuppressEsc。然后窗体的 KeyUp 处理程序可以定位当前获得焦点的控件并在获得焦点的控件实现 ISuppressEsc 时取消关闭。请注意,如果焦点控件可能是嵌套控件,则必须做额外的工作才能找到焦点控件。
public interface ISuppressEsc
{
// marker interface, no declarations
}
public partial class UserControl1 : UserControl, ISuppressEsc
{
public UserControl1()
{
InitializeComponent();
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
textBox1.Text = DateTime.Now.ToLongTimeString();
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
KeyPreview = true;
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
var activeCtl = ActiveControl;
if (!(activeCtl is ISuppressEsc) && e.KeyCode == Keys.Escape)
{
Close();
}
}
}