C#: TextBox не получает ключи при использовании TextPreview в форме

Я реализую функцию поиска в форме окна в C#. Я поставил KeyPreviewtrue в форме и добавили обработчик событий для 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);
    }

С уважением.

Другие вопросы по тегам