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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当用户控件具有焦点时,如何触发表单级事件?相关的知识,希望对你有一定的参考价值。

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

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

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

以上是关于当用户控件具有焦点时,如何触发表单级事件?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义控件中,有CheckBox控件,当触发OnCheckedChanged事件时

winform Form 内控件焦点变化?

Input 控件的Onchange 与onBlur 事件区别?

onBlur事件是啥?

关闭 Access 并引发“无法将焦点移至控件”错误时触发加载事件

delphi7如何知道Edit控件现在正拥有焦点?当tab移到它时.