我的UserControl
有TreeView
和TabControl
。此用户控件以正常形式托管。
如果用户从树视图中选择了某些内容,则会将自定义图片框添加到tabcontrol的标签页中。现在我想处理这个图片框上的键,但是我在custompicturebox中创建的事件没有被调用。我想要的是处理箭头键,但焦点停留在树视图上,因此箭头键只发生在树视图中。
我提供了代码,以便在用户点击时将焦点放在图片框上,但它不会帮助从树视图中移除焦点。以下是我在custompicturebox控件中的代码的一部分:
更新
似乎只有像ARROW键这样的特殊键不起作用,我的猜测是因为树视图正在注册箭头键。如果我将图片框中的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?
}
在托管此UserControl的表单中,我将KeyPreview
设置为True
,但我还必须处理此表单上的其他事件。也许这就是为什么我无法在customcontrol中获得keypress?
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;
}
}
这是程序的样子:
答案 0 :(得分:0)
处理此问题的一种方法是覆盖Form的ProcessCmdKey方法。在将它们分派到目标控件(具有焦点的控件)之前,您将获得WM_KEYDOWN消息。在那里,您可以执行自己的逻辑来处理击键,并允许或禁止进一步处理消息。