Winforms 如何在自定义容器控件中激发KeyDown事件?
我有一个自定义容器控件(源自Winforms 如何在自定义容器控件中激发KeyDown事件?,winforms,keydown,Winforms,Keydown,我有一个自定义容器控件(源自FlowLayoutPanel),其中包含零个或多个由用户拖动到那里的子控件。单击子控件时,它将被“选中”。(它使用彩色边框绘制,并且可以使用选项更改其属性。) 我希望处理Delete键,这样,如果用户当前正在容器控件中工作(例如,在控件内或子控件上单击),则删除当前选择的控件(如果有) 我已经在子项上使用右键单击上下文菜单实现了删除功能。我的问题是处理Delete键。我不知道如何使KeyDown事件在容器控件内引发。我知道它与焦点有关,因此必须调用Control.S
FlowLayoutPanel
),其中包含零个或多个由用户拖动到那里的子控件。单击子控件时,它将被“选中”。(它使用彩色边框绘制,并且可以使用选项更改其属性。)
我希望处理Delete
键,这样,如果用户当前正在容器控件中工作(例如,在控件内或子控件上单击),则删除当前选择的控件(如果有)
我已经在子项上使用右键单击上下文菜单实现了删除功能。我的问题是处理Delete
键。我不知道如何使KeyDown事件在容器控件内引发。我知道它与焦点有关,因此必须调用Control.Select()
(或其等效项),但最好的方法是什么?这个焦点逻辑在哪里?还是有更好的办法
我不想在表单中处理KeyDown
事件,然后嗅出焦点在哪里。这是一个可重用的容器控件,我希望逻辑驻留在那里
要在自定义控件上触发按键
事件,我必须做什么
public class MyContainer : FlowLayoutPanel
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
MessageBox.Show("How do I get here?");
e.Handled = true;
}
base.OnKeyDown(e);
}
}
拖到容器中的项目是否可能正在接收事件
可能在将项目放入容器后,您需要手动将焦点设置为容器。对于MSDN上的FlowLayoutPanel控件,KeyDown事件被列为无意义。建议将该活动作为备选方案。谢谢您的建议。在我的场景中,PreviewKeyDown事件也没有触发。当我继续玩它的时候,我意识到我上面的问题可能太简单了。我的容器控件托管在UserControl中,这似乎使生活更加复杂。感谢您的回复。这让我找到了解决办法。子控件也无法接收焦点,因此在我的整个控件继承权范围内,任何东西都无法说“嘿!我现在有焦点了!”。我刚刚在我的子控件的OnMouseDown方法重写中执行了一个Control.Select()。然后我就可以处理OnKeyDown事件了。如果我必须在容器中处理它,我可以按照您的建议执行或重写ProcessKeyPreview方法,后者看起来很痛苦。:)