【问题标题】:UserControl Keyboard FocusUserControl 键盘焦点
【发布时间】:2013-11-28 01:23:21
【问题描述】:

我得到了一个带有许多按钮的表单(假设有 20 个)。在中间,我得到了一个完全为空的用户控件。问题是:我怎样才能使它在单击用户控件时获得键盘焦点?

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

那么,换句话说,我们怎样才能让一个控件中的键盘焦点没有可聚焦的项目呢?如何制作一个键盘无法聚焦的控件来捕捉这些事件?除了使用 raw-WIN32 API 硬核之外,还有什么方法可以在窗口范围内获取这些事件?

【问题讨论】:

    标签: c#


    【解决方案1】:

    UserControl 在很大程度上被设计为其他控件的容器控件。它讨厌获得焦点,并试图在它获得的第一时间将其传递出去。您不应该在这里使用 UserControl,因为您没有在其中放置任何控件。面板控件就足够了。哪个有完全相同的问题,它也不想获得焦点。

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

    【讨论】:

    • 汉斯您好,感谢您回答 ::- )。我确实在其中添加了控件。其他用户控件。而且我使用了用户控件(不是面板),因为我正在自定义绘制所有内容。我在另一个线程中查看了您的答案。好东西。你有一个高分是有充分理由的::-)。 +2。
    【解决方案2】:

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

        /// <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);
        }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多