我有一个情况,我得到了一个WinForms TextBox实例,我想要给它添加自动完成功能。
我已经弄清楚了自动完成(字符串匹配+下拉菜单)的所有内容,并且目前它可靠地工作。
问题是如何使用键盘导航下拉菜单(这种UI通常都支持)。
自然的解决方案是处理TextBox的KeyDown事件(或类似事件),并相应地移动下拉菜单中的选项。但是,要做到这一点,您需要重写IsInputKey()事件以允许捕获箭头键事件。另一种方法是重写ProcessCmdKey()并在那里处理事件。这两种方法的问题是我不能覆盖任何东西,因为我无法替换TextBox实例。
编辑:假设我有以下代码:
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;
}
}
}
}
以上代码的问题在于,它从未被调用。箭头键事件从未被触发。更多信息请参考:上下左右箭头键不会触发KeyDown事件
Form
级别上进行按键预览。或者你可以使用 keyboard hook。 - Sinatr