处理 winform 文本框上的箭头键事件而不覆盖

Chr*_*ian 5 c# textbox keyevent winforms

我遇到一种情况,我获得了一个 WinForms TextBox 实例,我想将自动完成功能附加到该实例。

我已经解决了自动完成(字符串匹配+下拉)的问题,并且到目前为止它工作可靠。

使用键盘导航下拉菜单的能力是什么(这是此类 UI 的标准)。

自然的解决方案是处理文本框的 KeyDown (或类似的)事件,并相应地移动下拉列表中的选择。

然而,要做到这一点,您需要重写该IsInputKey()事件以允许捕获箭头键事件。另一种方法是重写ProcessCmdKey()并处理那里的事件。这两个的问题是我无法覆盖任何内容,因为我无法替换文本框实例。

编辑:假设我有以下代码:

void _textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (_dropdown.Visible)
    {
        // TODO The stuff below fails because we need to either handle ProcessCmdKey or override IsInputKey
        switch (e.KeyCode)
        {
            case Keys.Tab:
                {
                    // click selected item
                    _dropdown.Items[GetSelectedItemIndex()].PerformClick();
                    break;
                }
            case Keys.Down:
                {
                    // select next (or first) item
                    int i = GetSelectedItemIndex() + 1;
                    if (i >= _dropdown.Items.Count) i = 0;
                    _dropdown.Items[i].Select();
                    break;
                }
            case Keys.Up:
                {
                    // select previous (or last) item
                    int i = GetSelectedItemIndex() - 1;
                    if (i < 0) i = _dropdown.Items.Count - 1;
                    _dropdown.Items[i].Select();
                    break;
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是它从未被调用。方向键永远不会触发该事件。详细信息:向上、向下、向左和向右箭头键不会触发 KeyDown 事件

Jen*_*ens 0

我希望我没有误解你,但这是否是一个解决方案:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down)
    {
         // Place logic for textbox here
    }
}
Run Code Online (Sandbox Code Playgroud)

我会在表单上使用 KeyDown 事件,然后将键码与 Keys.Down 键码进行比较

不工作

看这里:上、下、左、右方向键不触发KeyDown事件