如何让内部表单对按键事件做出响应
本文关键字:事件 响应 内部 表单 | 更新日期: 2023-09-27 18:00:58
我有一个MainView表单,它只包含一个面板。我使用一个单独的类(Presenter(来管理将根据不同事件在该面板中显示的形式。当显示其中一个子表单时,我希望能够按下一个键并让该子表单响应;但是,keydown事件不在子窗体中发生,只在主窗体中发生。
我想知道如何让子窗体响应关键事件,而不需要从MainView->Presenter->SubView进入。
由于Presenter类知道它要放入面板中的表单,因此它还需要从该表单或相关数据中获取表单中的控件的默认焦点。据推测,您的Presenter类有一个方法可以在该面板上显示给定的表单,因此您可以执行以下操作:
Presenter.ShowForm(MainViewPanel, Form1);
然后你需要做一些类似的事情:
Form1.Controls.OrderBy(x => x.TabIndex).First().Focus();
重点是什么?如果子窗体中没有带焦点的控件,它将永远看不到键盘事件。
另外,尝试在子窗体上将KeyPreview设置为true。
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110(.aspx
好吧,我弄清楚了我的问题是什么。这是一些帖子的组合,但我想把我必须做的一切都放在一个地方。
我有一个看起来像这样的方法:
private void DisplayView(Form view)
{
if (view == null || view == _mainView) return;
view.TopLevel = false;
_mainView.GameArea.Controls.Clear();
_mainView.GameArea.Controls.Add(view);
view.Dock = DockStyle.Fill;
view.BringToFront();
view.Show();
_mainView.GameArea.Controls[0].Focus();
}
这是修复它的线路:
_mainView.GameArea.Controls[0].Focus();
我可以通过这种方式设置视图的焦点,而不是浏览"视图"变量并设置焦点。
我还不得不从小组的收藏中删除其他视图:
_mainView.GameArea.Controls.Clear();