我有一个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);
}
}
}
答案 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。这在您的用例中看起来不是问题,但最好事先了解。