从父级别的任何子控件捕获击键

时间:2016-06-15 22:08:05

标签: c# winforms events parent-child keystroke

我有一个WinForm控件,它有很多子控件。父控件永远不会有焦点。我想在父级别处理在子级别发生的某些关键笔划组合。下面是我想要完成的一个简单示例。如果ChildB(或ChildB中的某些控件)具有焦点,则按Ctrl + A应从视图中删除ChildB并添加ChildA。

public partial class ParentControl : UserControl
{
    ChildControl ChildA = new ChildControl();
    ChildControl ChildB = new ChildControl();
    ChildControl ChildC = new ChildControl();

    public ParentControl()
    {
        InitializeComponent();
        Controls.Add(ChildA);
    }

    private void CapturedFromCildControl(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.A)
        {
            Controls.Clear();
            Controls.Add(ChildA);
        }
        if (e.Control && e.KeyCode == Keys.B)
        {
            Controls.Clear();
            Controls.Add(ChildB);
        }
        if (e.Control && e.KeyCode == Keys.C)
        {
            Controls.Clear();
            Controls.Add(ChildC);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以让表单预览所有键。为此,您将表单(!)的属性KeyPreview设置为true(deault为false)。当此属性为true时,所有子窗口的按键事件将首先通过Form KeyEvent处理程序。

然后,您可以使用ParentForm参考从ParentControl订阅这些活动。 Load的{​​{1}}事件应如下所示:

ParentControl

在测试期间,您会注意到private void ParentControl_Load(object sender, EventArgs e) { this.Controls.Add(new ChildControl1()); this.ParentForm.KeyDown += CapturedFromCildControl; } 将是对表单的引用,而不是捕获按键的ChildControl。这在您的用例中看起来不是问题,但最好事先了解。

相关问题