【问题标题】:Disable jumping between buttons by using arrow keys使用箭头键禁用按钮之间的跳转
【发布时间】:2021-04-04 20:07:40
【问题描述】:

我有一个带有TableLayoutPanel 的 WinForms 表单。 在这个 TableLayoutPanel 中,我有 2 个Button 控件。

我按下这些按钮之一。 然后我按键盘上的向上或向下箭头 ( )。

焦点从一个按钮跳到另一个按钮。

我不想要这种行为。 将 TableLayoutPanel 的“TabStop”设置为“False”没有帮助。

我想拦截事件并手动将焦点设置到另一个控件。 但是,我没有找到需要拦截的事件。

我怎样才能通过箭头键禁用这种跳跃? 我必须拦截哪个事件才能将焦点设置到另一个控件?

谢谢!

【问题讨论】:

    标签: c# .net winforms button


    【解决方案1】:

    您可以使用单个处理程序处理所有按钮的PreviewKeyDown 事件并检查按下的键是否为箭头键,设置e.IsInputKey = true 并防止焦点更改:

    private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        var keys = new[] { Keys.Left, Keys.Right, Keys.Up, Keys.Down };
        if (keys.Contains(e.KeyData))
            e.IsInputKey = true;
    }
    

    您可以在PreviewKeyDown 文档的Remarks 部分阅读有关行为和解决方案的信息。

    该行为实际上是在容器控件的ProcessDialogKey 方法中实现的(您可以看到source code),您也可以通过覆盖FormProcessDialogKey 来防止它,如下所示:

    protected override bool ProcessDialogKey(Keys keyData)
    {
        var keys = new[] { Keys.Left, Keys.Right, Keys.Up, Keys.Down };
        if (keys.Contains(keyData))
            return true;
        else
            return base.ProcessDialogKey(keyData);
    }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多