当用户控件具有焦点时,如何触发窗体级别事件?



我有一个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;
}
}

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

然后,此属性将确保窗体首先获取击键,然后再执行控件

另请参阅此

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

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;
}

相关内容

  • 没有找到相关文章