C#: TextBox не получает ключи при использовании TextPreview в форме
Я реализую функцию поиска в форме окна в C#. Я поставил KeyPreview
true в форме и добавили обработчик событий для KeyDown
так что я могу ловить такие вещи, как ctrl+f
, esc
а также enter
,
Я ловлю эти ключи очень хорошо, и я могу заставить мое текстовое поле появляться, но я не могу набрать в поле. Все ключи собираются PortsTraceForm_KeyDown(...)
но они никогда не попадают в текстовое поле. Согласно странице MSDN о 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;
}
2 ответа
Ваш TextBox, вероятно, не имеет фокуса, даже если вы звоните Focus()
, Из документации:
Фокус - это низкоуровневый метод, предназначенный главным образом для авторов пользовательских элементов управления. Вместо этого разработчики приложений должны использовать метод Select или свойство ActiveControl для дочерних элементов управления или метод Activate для форм.
Вы можете проверить возвращаемое значение Focus()
для успеха, но в прошлом мне почти не везло, когда я использовал этот метод для фокусировки на произвольном элементе управления. Вместо этого попробуйте использовать метод, который предлагает документация, то есть вызов Select()
,
РЕДАКТИРОВАТЬ:
Неважно (хотя это все еще действительный совет), я думаю, что вижу вашу проблему:
e.SuppressKeyPress = true
Почему вы это делаете? Опять же из документов:
[SuppressKeyPress] Получает или задает значение, указывающее, должно ли ключевое событие передаваться нижележащему элементу управления.
Таким образом, вы намеренно запрещаете TextBox получать ключевые события. Если вы хотите пропустить событие, вам не следует устанавливать это свойство в false
,
Попробуйте этот пример метода переопределений.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// your code here
// this is message example
MessageBox.Show(keyData.ToString());
return base.ProcessCmdKey(ref msg, keyData);
}
С уважением.