如何让内部表单对按键事件做出响应

本文关键字:事件 响应 内部 表单 | 更新日期: 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();