Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让内部窗体响应按键关闭事件?_C#_.net_Winforms - Fatal编程技术网

C# 如何让内部窗体响应按键关闭事件?

C# 如何让内部窗体响应按键关闭事件?,c#,.net,winforms,C#,.net,Winforms,我有一个MainView表单,它只包含一个面板。我使用一个单独的类(Presenter)根据不同的事件来控制面板中显示的形式。当其中一个子表单显示时,我希望能够按下一个键并让该子表单响应;但是,keydown事件不会在子窗体中出现,而只在主窗体中出现 我想知道如何让子表单响应关键事件,而不必从MainView->Presenter->SubView进入?如果子窗体中没有具有焦点的控件,它将永远看不到键盘事件 另外,尝试在子窗体上将KeyPreview设置为true 由于Presenter类知道

我有一个MainView表单,它只包含一个面板。我使用一个单独的类(Presenter)根据不同的事件来控制面板中显示的形式。当其中一个子表单显示时,我希望能够按下一个键并让该子表单响应;但是,keydown事件不会在子窗体中出现,而只在主窗体中出现


我想知道如何让子表单响应关键事件,而不必从MainView->Presenter->SubView进入?如果子窗体中没有具有焦点的控件,它将永远看不到键盘事件


另外,尝试在子窗体上将KeyPreview设置为true


由于Presenter类知道它正在放入面板中的表单,因此它还需要从该表单或相关数据中获取表单中具有默认焦点的控件。您的Presenter类可能有一个在该面板上显示给定表单的方法,因此您可以执行以下操作:

Presenter.ShowForm(MainViewPanel, Form1);
Form1.Controls.OrderBy(x => x.TabIndex).First().Focus();
然后,您需要执行以下操作:

Presenter.ShowForm(MainViewPanel, Form1);
Form1.Controls.OrderBy(x => x.TabIndex).First().Focus();

好吧,我知道我的问题是什么了。这是几个帖子的组合,但我想把我必须做的所有事情都放在一个地方

我有一个方法如下所示:

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();

您不能只在子窗体上添加事件侦听器吗?您需要
KeyPreview
property@Jonesopolis我尝试将KeyPreview属性设置为true,而且它仍然不会在Key_Down事件开始时到达断点。@笔名我试图避免这种情况,因为我希望程序流必须通过Presenter类,如果它需要从一个视图到另一个视图进行对话。在main
Form
中重写。我正在以编程方式将子表单添加到MainView的panel.Controls集合中。我添加了行子窗体。Focus();但它仍然不起作用。此外,设置为true的KeyPreview似乎也不起作用。它不会触发断点。我做WinForms编程已经有一段时间了,但我认为表单本身无法获得焦点。我认为它必须是一个控件。不要将焦点放在表单上。在窗体中的控件上设置焦点。