我有一个Windows窗体应用程序(使用.net / c#),它有一个表单。从设计视图中,表单中没有任何控件。
我还有自定义的“Screen”类,它继承自用户控件类,并且大小适合表单。屏幕类有许多事件处理程序,可以回调它们添加到的表单。
我有一个Screen对象数组,这些对象以编程方式创建并作为控件添加到表单中。
foreach(Screen s in screens)
{
Controls.Add(s);
}
单击任何屏幕上的下一个或上一个按钮间接调用表单中的适当方法(通过事件处理程序) - 然后表单通过Visible和Enabled属性处理切换屏幕 - 即当屏幕需要时删除或显示相应的Visible和Enabled属性分别设置为false和true。
每个屏幕负责控制显示内容的代码,表单代码只处理从一个屏幕到另一个屏幕的流程。
因此,主窗体中下一个按钮处理程序的示例可能类似于
screens[currScreen].Visible = false;
screens[currScreen].Enabled = false;
currScreen++;
screens[currScreen].Visible = true;
screens[currScreen].Enabled = true;
这一切都很好,直到我尝试处理转义键。
我希望能够让用户按退出键退出应用程序。所以我的第一个想法是在以编程方式初始化时简单地将以下代码添加到每个屏幕......
screen[n].KeyUp += OnKeyUP; // Where on key up is an event handler in the main form
这里的想法是我可以在控件中捕获事件并在表单中处理它以调用...
private void OnKeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Escape)
{
this.Close();
}
}
我知道这种类型的事件捕获工作正如我已用于某些鼠标操作,但它从不适用于键盘。所以我也尝试将事件处理程序放在我的屏幕类中,这也不起作用。
我意识到控制器可能没有焦点,因此不能捕获键盘。所以我在表单中添加了以下调试代码......
Console.WriteLine("Control: {0} - Focus = {1}", this.ToString(), this.Focused);
foreach (Control c in this.Controls)
{
Console.WriteLine("Control: {0} - Focus = {1}", c.ToString(), c.Focused);
}
没有任何焦点,所以我不确定焦点是什么?
此外,我似乎无法获得任何重点,我已经尝试在控件和窗体上调用.Activate()以及.Focus(),每当我重新运行上面的代码时,仍然没有任何焦点。
如果我删除了将屏幕控件添加到表单的代码,然后运行上面的代码,则表单KeyUp事件会检测到键击,并且表单具有焦点。添加控件似乎可以阻止任何焦点。
任何人都知道如何让Screen控件接收keyup事件,或者让他们专注?我确定这是一个非常明显的愚蠢,我做错了,但我现在正撞墙而已。
感谢。