C #: TextBox не получает ключи при использовании TextPreview в форме - PullRequest
1 голос
/ 12 сентября 2011

Я реализую функцию поиска в форме окна в 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 ]

1 голос
/ 12 сентября 2011

Ваш TextBox, вероятно, не имеет фокуса, даже если вы звоните Focus().Из документации:

Фокус - это низкоуровневый метод, предназначенный главным образом для авторов пользовательских элементов управления.Вместо этого разработчики приложений должны использовать метод Select или свойство ActiveControl для дочерних элементов управления или метод Activate для форм.

Вы можете проверить возвращаемое значение Focus() для успеха, но я имелнемного удачи в прошлом, используя этот метод, чтобы установить фокус на произвольный элемент управления.Вместо этого попробуйте использовать метод, который предлагается в документации, например, позвоните Select().

РЕДАКТИРОВАТЬ:

Неважно (хотя это все еще действительный совет), я думаю, я вижу вашу проблему:

e.SuppressKeyPress = true

Зачем ты это делаешь?Снова, с документы:

[SuppressKeyPress] Получает или задает значение, указывающее, должно ли ключевое событие передаваться нижележащему элементу управления

Таким образом, вы намеренно запрещаете TextBox получать ключевые события.Если вы хотите пропустить событие, вам не следует устанавливать это свойство на false.

0 голосов
/ 12 сентября 2011

попробуйте этот пример метода переопределений.

    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);
    }

С уважением.

...