C# 未在UserControl中触发KeyDown事件
我有一个C# 未在UserControl中触发KeyDown事件,c#,winforms,keyboard,focus,keyevent,C#,Winforms,Keyboard,Focus,Keyevent,我有一个UserControl,它有一个TreeView和一个TabControl。此usercontrol以正常形式承载 如果用户从treeview中选择某个内容,则会将自定义picturebox添加到tabcontrol的tabpage中。现在我想处理这个picturebox上的键,但是我在custompicturebox中创建的事件没有被调用。我想要的是处理箭头键,但是焦点停留在树视图上,所以箭头键只发生在树视图中 我使用代码在用户单击picturebox时为其提供焦点,但这无助于从tre
UserControl
,它有一个TreeView
和一个TabControl
。此usercontrol以正常形式承载
如果用户从treeview中选择某个内容,则会将自定义picturebox添加到tabcontrol的tabpage中。现在我想处理这个picturebox上的键,但是我在custompicturebox中创建的事件没有被调用。我想要的是处理箭头键,但是焦点停留在树视图上,所以箭头键只发生在树视图中
我使用代码在用户单击picturebox时为其提供焦点,但这无助于从treeview中删除焦点。以下是我在custompicturebox控件中的部分代码:
更新
似乎只有像箭头键这样的特殊键不起作用,我的猜测是因为箭头键被treeview注册了。如果我将picturebox中的KeyDown
事件更改为使用字符键,它会工作
private void IcPackageViewBox_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Right)
{
OnPinClicked(_pinMap[_pinRectIndex].Pin);
if (_pinRectIndex < _pinMap.Count)
_pinRectIndex++;
else
_pinRectIndex = 0;
}
}
//Mouse Down Event
private void PackageViewBox_MouseDown(object sender, MouseEventArgs e)
{
Focus();
BringToFront(); //bring to front works! maybe it means focus should work also?
}
下面是这个程序的样子:
处理此问题的一种方法是重写表单的方法。在那里,在将WM_KEYDOWN消息发送到目标控件(具有焦点的控件)之前,您将获得这些消息。在那里,您可以执行自己的处理击键的逻辑,并允许或不允许进一步处理消息。处理此问题的一种方法是重写表单的方法。在那里,在将WM_KEYDOWN消息发送到目标控件(具有焦点的控件)之前,您将获得这些消息。在那里,您可以执行自己的处理击键的逻辑,并允许或不允许进一步处理消息
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
projectBrowser.ControlKeyIsDown = true;
e.Handled = true;
}
}
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Control)
{
projectBrowser.ControlKeyIsDown = false;
e.Handled = true;
}
}