2

我有一个UserControl有一个TreeView和一个TabControl。此用户控件以正常形式托管。

如果用户从树形视图中选择某些内容,则会将自定义图片框添加到选项卡控件的选项卡页中。现在我想处理这个图片框上的键,但是我在 custompicturebox 中创建的事件没有被调用。我想要的是处理箭头键,但焦点停留在树视图上,所以箭头键只发生在树视图中。

当用户单击它时,我添加了代码以将焦点集中在图片框上,但它无助于从树视图中删除焦点。这是我在 custompicturebox 控件中的部分代码:

更新 似乎只有像箭头键这样的特殊键不起作用,我猜是因为树视图正在注册箭头键。如果我将图片框中的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但我还必须设置此表单上的其他事件。也许这就是为什么我无法在自定义控件中获得按键?

    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;
        }
    }

这是程序的样子: 在此处输入图像描述

4

1 回答 1

0

处理此问题的一种方法是覆盖 Form 的ProcessCmdKey方法。在那里,您将收到 WM_KEYDOWN 消息,然后再将它们分派到目标控件(具有焦点的控件)。在那里,您可以执行自己的逻辑来处理击键,并允许或禁止进一步处理消息。

于 2012-08-28T16:01:52.757 回答