我有一个表格上有许多按钮(假设为20)。在中间,我得到一个完全空的用户控件。问题是:我怎么能这样做,以便在单击用户控件时,它将获得键盘焦点?
原因:我用鼠标在用户控件中绘制形状。形状实际上是其他用户控件。我想要做的是能够使用键盘移动这些形状。但我似乎无法正确地抓住键盘焦点。 Key_Down
事件只是没有到达我的主要(绘图)用户控件。
因此,换句话说,我们如何在控件中使用键盘焦点上没有可聚焦的项目?如何才能使键盘无法控制,捕捉这些事件?有什么方法可以在窗口范围内抓取这些事件,而不是使用原始的WIN32 API硬核?
答案 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);