当用户控件具有焦点时,如何触发表单级事件?

时间:2019-03-27 13:07:34

标签: winforms events event-handling user-controls windows-forms-designer

我有一个Windows Form C#/。Net项目。有一个带有多个用户控件的表单。每个用户控件都停靠在其中,以使其占据整个窗体。单击一个用户控件上的按钮时,该用户控件被隐藏,而另一个控件出现。这是由同事完成的,并且正在生产中,不能更改(也就是说,除非确实有必要,否则我绝对不能摆脱用户控件,也不能更改它们)。我想要一个可以在某些事件(例如按某个特定的组合键,如CTRL-Q)上显示的窗体上的面板(或其他用户控件)。但是,如果我在窗体上放置KeyDown事件,则永远不会触发该事件,因为其中一个用户控件始终具有焦点。我可以将新面板放在每个用户控件上,并在每个控件上都具有KeyDown事件,但是我真的不应该更改现有的用户控件,并且我真的不希望此面板的多个实例和多个事件。当其中一个用户控件具有焦点时,如何触发表单级事件?

这是表单,用户控件和面板的布局方式。实际上,用户控件已停靠以填充整个表单。在此图中我将它们错开了,以便您可以看到它们的全部。

----------------------------------------------------------------------
| form1                                                              |
|                                                                    |
| ---------------------------------------------------------------    |
| | userControl1                                                |    |
| |                                                             |    |
| |                                                             |    |
| | --------------------------------------------------------    |    |
| | | userControl2                                         |    |    |
| | |                                                      |    |    |
| | |                                                      |    |    |
| | | --------------------------------------------------   |    |    |
| | | | userControl3                                    |  |    |    |
| | | |                                                 |  |    |    |
| | | ---------------------------------------------------  |    |    |
| | |                                                      |    |    |
| | --------------------------------------------------------    |    |
| |                                                             |    |
| ---------------------------------------------------------------    |
|                                                                    |
|                                                                    |
| ------------------------------------------------------------------ |
| | panel or user control on top of everything, visible on demand  | |
| ------------------------------------------------------------------ |
|                                                                    |
----------------------------------------------------------------------

无论活动的用户控件是什么,我想要从form1触发此事件:

    private void form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.Q)
        {
            panel1.Visible = true;
        }
    }

1 个答案:

答案 0 :(得分:1)

如果要在表单上使用KeyDownKeyUp事件,请始终确保将表单上的属性KeyPreview设置为TRUE

然后,此属性将确保在控件执行之前,表单首先获取击键。

另请参阅this

编辑
另一种方法是停止使用KeyDown/KeyUp事件,并按照@Jimi在其评论中建议的那样覆盖表单上的ProcessCmdKey

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool Result = true;

    if (keyData == Keys.Control | Keys.Q)
    {
         panel1.Visible = true;
    }
    else
    {
        Result = base.ProcessCmdKey(ref msg, keyData);
    }

    return Result;
}