[英]UserControl Keyboard Focus
我有一个带有许多按钮的表单(假设20)。 在中间,我得到了一个完全空的用户控件。 问题是:如何做到这一点,以便当单击用户控件时,它将获得键盘焦点?
原因:我用鼠标在该用户控件中绘制形状。 形状实际上是其他用户控件。 我想做的是能够使用键盘移动这些形状。 但是我似乎无法正确地抓住键盘焦点。 Key_Down
事件只是没有到达我的主要(吸引)用户控件。
那么,换句话说,我们如何在没有可聚焦项的控件中使键盘聚焦呢? 如何使键盘无法控制的控件捕获这些事件? 除了使用原始的WIN32 API铁杆,还可以在整个窗口范围内获取这些事件吗?
UserControl非常设计为其他控件的容器控件。 它讨厌获得焦点,并在有机会时尝试将其传递出去。 鉴于您没有在其中放置任何控件,因此不应在此处使用UserControl。 面板控件就足够了。 有完全相同的问题,它也不想得到关注。
需要手术以覆盖其行为。 您需要的一切都在此答案中 。
将此添加到您的用户控制代码中以捕获键盘输入:
/// <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);
}
请参阅http://msdn.microsoft.com/en-us/library/aa969768.aspx 。 您可以通过1分配键盘焦点。设置usercontrol.Focusable = true;。 2.使用Keyboard.Focus(usercontrol)。
您需要将控件上的CommandRouting标志设置为true。 命令路由依赖项属性是在公共API(MS.VS.Editor.dll)中定义的,您的装饰物将希望使用该API来指示其正在处理其命令,而不是允许包含文本的视图来处理它们。 您可以通过控件的初始化来实现。 Microsoft.VisualStudio.Editor.CommandRouting.SetInterceptsCommandRouting(this,true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.