【问题标题】:How do I trigger a form level event when a user control has the focus?当用户控件获得焦点时,如何触发表单级事件?
【发布时间】:2019-08-18 01:35:57
【问题描述】:

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

【问题讨论】:

  • 覆盖表单的ProcessCmdKey。 (即bool isControlQ = keyData == (Keys.Control | Keys.Q);)。表单将先处理任何密钥。

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


【解决方案1】:

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

然后,此属性将确保表单在控件之前先获得击键

另见this

编辑
另一种方法是停止使用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;
}

【讨论】:

  • 谢谢。设置 KeyPreview 对我有用。感谢您的帮助!
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多