【问题标题】:How to prevent usercontrol form handling keyboard input (arrow keys) in c#如何防止用户控件表单在c#中处理键盘输入(箭头键)
【发布时间】:2011-09-04 20:28:53
【问题描述】:

我的用户控件包含可以选择的其他控件,我想实现使用箭头键导航子控件的方式

问题是父控件拦截箭头键并使用它来滚动其视图我想要避免的事情是什么。我想自己解决导航控制内容的问题。

如何控制由箭头键引起的标准行为?

提前致谢 第M个

【问题讨论】:

  • 要么转发按键,要么在主机面板上设置一些属性以忽略事件。

标签: c# .net winforms user-controls keyboard


【解决方案1】:

这通常通过重写 IsInputKey() 方法来告诉您需要这些键。但是,这不适用于 UserControl,它永远不会获得焦点,因此 OnKeyDown 方法永远不会运行。相反,重写 ProcessCmdKey() 方法,它在表单看到击键之前被调用。像这样:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        switch (keyData) {
            case Keys.Left: MessageBox.Show("Left!"); break;
            case Keys.Right: MessageBox.Show("Right!"); break;
            default: return base.ProcessCmdKey(ref msg, keyData);
        }
        return true;  // used
    }

【讨论】:

    【解决方案2】:

    您可以在用户控件中覆盖 OnKeyDown,但这不适用于箭头键,因为它们不是“输入键”(它们是导航键)。

    要更改行为,请重写 IsInputKey() 以告诉系统您要获取箭头键的事件:

        protected override bool IsInputKey(Keys keyData)
        {
            bool result = false;
    
            Keys key = keyData & Keys.KeyCode;
    
            switch (key)
            {
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Left:
                    result = true;
                    break;
    
                default:
                    result = base.IsInputKey(keyData);
                    break;
            }
    
            return result;
        }
    

    【讨论】:

    • 查看 Hans Passant 的回答 - 这也可以。 IsInputKey 在 UserControls 中工作正常(刚刚测试了上面的示例)
    • 两个答案都解决了问题,但是在 ProcessCmdKey 上使用覆盖似乎更正确,无论如何谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2013-05-12
    相关资源
    最近更新 更多