UserControl键盘焦点

时间:2010-11-01 16:35:45

标签: c#

我有一个表格上有许多按钮(假设为20)。在中间,我得到一个完全空的用户控件。问题是:我怎么能这样做,以便在单击用户控件时,它将获得键盘焦点?

原因:我用鼠标在用户控件中绘制形状。形状实际上是其他用户控件。我想要做的是能够使用键盘移动这些形状。但我似乎无法正确地抓住键盘焦点。 Key_Down事件只是没有到达我的主要(绘图)用户控件。

因此,换句话说,我们如何在控件中使用键盘焦点上没有可聚焦的项目?如何才能使键盘无法控制,捕捉这些事件?有什么方法可以在窗口范围内抓取这些事件,而不是使用原始的WIN32 API硬核?

4 个答案:

答案 0 :(得分:6)

UserControl非常适合作为其他控件的容器控件。它憎恶获得焦点并试图在它获得第一次机会时将其传递出去。你不应该在这里使用UserControl,因为你没有在其中放置任何控件。 Panel控件就足够了。哪个有完全相同的问题,它也不想获得焦点。

需要手术来覆盖其行为。您需要的一切都在this answer

答案 1 :(得分:1)

将此添加到您的用户控制代码以捕获键盘输入:

    /// <summary>Keys which can generate OnKeyDown event.</summary>
    private static readonly Keys[] InputKeys = new []
        { Keys.Left, Keys.Up, Keys.Right, Keys.Down, };

    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
        if(Array.IndexOf<Keys>(InputKeys, e.KeyCode) != -1)
        {
            e.IsInputKey = true;
        }
        base.OnPreviewKeyDown(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        // just to illustrate this works
        MessageBox.Show("KeyDown: " + e.KeyCode);
    }

答案 2 :(得分:0)

http://msdn.microsoft.com/en-us/library/aa969768.aspx。您可以指定键盘焦点 1.设置usercontrol.Focusable = true; 2.使用Keyboard.Focus(usercontrol)。

答案 3 :(得分:0)

您需要将控件上的CommandRouting标志设置为true。 命令路由依赖项属性在公共API(MS.VS.Editor.dll)中定义,并且您的装饰将希望使用该API来指示它正在处理其命令,而不是允许包含文本视图处理它们。您可以从控件的初始化中执行此操作。 Microsoft.VisualStudio.Editor.CommandRouting.SetInterceptsCommandRouting(this,true);