如何使用C#中的箭头禁用WinForm上的导航?

如何使用C#中的箭头禁用WinForm上的导航?,c#,winforms,focus,C#,Winforms,Focus,我需要禁用在窗体上使用箭头更改焦点。有没有一个简单的方法 谢谢您应该在表单上将KeyPreview设置为true。处理KeyDown/keypup/KeyPress事件,并将eventhandler中的e.Handled设置为true,以用于要忽略的键。以下内容: private void Form1_Load(object sender, EventArgs e) { foreach (Control control in this.Controls)

我需要禁用在窗体上使用箭头更改焦点。有没有一个简单的方法


谢谢

您应该在表单上将
KeyPreview
设置为true。处理
KeyDown/keypup/KeyPress
事件,并将eventhandler中的
e.Handled
设置为true,以用于要忽略的键。

以下内容:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (Control control in this.Controls)
        {
            control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);
        }
    }

    void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
        {
            e.IsInputKey = true;
        }
    }

最后,我编写了下面的代码,将该功能设置为窗体上的每个控件:

(代码基于Andrynormancx的代码)


我尝试了这个方法,表单只处理一次预览事件。它生成的代码比其他选项少

只需将此方法添加到表单的
PreviewKeyDown
事件中,并将
KeyPreview
属性设置为
true

private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
        case Keys.Down:
        case Keys.Left:
        case Keys.Right:
            e.IsInputKey = true;
            break;
        default:
            break;
    }
}

这种方法似乎不起作用,PreviewKeyDownEventArgse上没有处理e。处理过的存在,但在方法:private void Form1_KeyUp(对象发送方,KeyEventArgs e),KeyDown等中。我也有这种方法的问题。我将在clean project上试用它。是的,它存在于KeyDown事件中,但设置它没有帮助,此时导航已经发生。我不确定何时进行导航。下面的建议很有效,非常有效。非常感谢。给其他人一个简短的提示:foreach(这个.Controls中的Control控件)并不包含所有控件-您可能在表单上有容器(例如,system.windows.forms.panel)。您可能没有想到这一点,但这似乎完全可行。(我的目标是有条件地禁用Enter,但想法相同。)谢谢!啊,谢谢!!该键是PreviewKeyDown事件,而不是KeyDown事件。我试图在KeyDown事件下解决这个问题,但一旦我将空格键设置为输入键,问题就解决了。现在我的按钮不会被空格点击:)嗨,卡洛斯。我想使用你的较短版本,但当我测试它时,不幸的是它没有达到应有的效果。。(当然,我记得设置
Form.KeyPreview=true)。只有当我在表单_Load中添加foreach()时,行为才发生了变化。。您测试过吗?如果表单包含多个级别的容器层次结构,则此操作不起作用。
private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
        case Keys.Down:
        case Keys.Left:
        case Keys.Right:
            e.IsInputKey = true;
            break;
        default:
            break;
    }
}