繁体   English   中英

UserControl键盘焦点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM