2010-11-01 82 views
2

我得到了一个窗体上有一些按钮(假设20)。在中间,我得到了一个完全空的用户控制。问题是:我怎样才能做到这一点,使用户控制单击时,它将获得键盘焦点?用户控制键盘焦点

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

换句话说,我们如何让键盘焦点在控件上没有可聚焦的项目呢?如何才能使键盘无法对焦的控制,捕捉这些事件?除了进入原始的WIN32 API硬核之外,还可以在窗口范围内捕获这些事件?

回答

6

UserControl的设计非常适合其他控件的容器控件。它憎恨焦点并试图首先把它传递出去。你不应该在这里使用UserControl,因为你没有在其中放置任何控件。面板控件就足够了。它有完全相同的问题,它不想获得焦点。

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

+0

你好汉斯,谢谢你的回答:: - )。我在其中添加控件。其他用户控件。而且我使用了用户控件(不是面板),因为我自定义绘制所有内容。我在另一个线索中回顾了你的答案。好东西。你有一个很好的理由高分 - ::)。 +2。 – Axonn 2010-11-01 16:57:37

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); 
    } 
+0

很酷,谢谢你的回答! :: - D. +1。 – Axonn 2010-11-01 17:23:17

0

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