我正在 c# 中以 windows 形式实现搜索功能。我已KeyPreview
在表单上设置为 true 并添加了一个事件处理程序,KeyDown
以便我可以捕获ctrl+f
,esc
和enter
.
我很好地抓住了这些键,我可以让我的文本框出现,但我无法在框中输入。所有的键都可以,PortsTraceForm_KeyDown(...)
但它们永远不会进入文本框。根据 msdn 页面 about KeyPreview
,将 e.Handled 设置为 false 应该会导致事件传递到焦点视图(文本框),但这并没有发生。我没有KeyDown
为文本框注册事件,所以它应该使用默认行为。我错过了什么吗?
KeyDown 事件:
private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
e.Handled = false;
if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
{
e.Handled = true;
ShowSearchBar();
}
else if (e.KeyCode == Keys.Escape) // esc
{
e.Handled = true;
HideSearchBar();
}
else if (e.KeyCode == Keys.Enter) // enter
{
if (searchPanel.Visible)
{
e.Handled = true;
if (searchShouldClear)
SearchStart();
else
SearchNext();
}
}
}
显示搜索栏:
private void ShowSearchBar()
{
FindBox.Visible = true;
FindBox.Focus(); // focus on text box
}
隐藏搜索栏:
private void HideSearchBar()
{
this.Focus(); // focus on form
FindBox.Visible = false;
}