取消 PreviewKeyDown

Cancel PreviewKeyDown

当输入光标位于文本框中时,我想抓住箭头键, 做一些处理然后防止这个事件被输入处理。

KeyPress 事件中,我们有 KeyPressEventArgs 可以放入 e.Handled=false; 去处理。 但是箭头键不会触发 KeyPress 事件。

我试过 e.IsInputKey = true; 然后 int KeyDown 事件,正如 MS 所说。

Msdn Control.PreviewKeyDown Event

但似乎 e.Handled=false; 也不起作用。

这是我当前的代码

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

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{                         
     if (e.KeyCode == Keys.Right || e.KeyCode == Keys.Left)
     {
            // some other treatment [...]
        e.Handled = false;               
     }
}

我想更改 TextBox 中移动光标的默认按下箭头行为。我不希望 "r" 和 "l"(上图)之间的打字光标能够移动。

有什么建议吗?

问题含糊不清,它没有描述需要不同操作的特定 光标键。重要的是,TextBox 已经将左右光标键变成了输入键。这样它们就不会被用于控件之间的导航。如果你想拦截 Up/Down 光标键,你只需要 PreviewKeyDown 。在 KeyDown 事件处理程序中实现行为。

意图也很模糊,我只举一个非常愚蠢的例子,交换光标键的方向:

    private void textBox1_KeyDown(object sender, KeyEventArgs e) {
        var box = (TextBox)sender;
        if (e.KeyData == Keys.Left) {
            if (box.SelectionStart < box.Text.Length)
                box.SelectionStart++;
            e.Handled = true;
        } else if (e.KeyData == Keys.Right) {
            if (box.SelectionStart > 0)
                box.SelectionStart--;
            e.Handled = true;
        }
    }

请注意如何将 e.Handled 设置为 true 以确保击键不会传递到控件。