Как перехватить клавишу Tab в поле редактирования

Мне нужно настраиваемое поведение клавиш табуляции в элементе управления RichTextEdit.

На данный момент лучшее, что у меня есть, это:

editBox.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.field_PreviewKeyPress);


  private void field_PreviewKeyPress(object sender, PreviewKeyDownEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Tab: 
                     //Some code here
                break;
            }
        }

Клавиша табуляции регистрируется нормально, но после этого элемент управления все равно обрабатывает клавишу и перемещает фокус на следующий элемент управления. Кажется, нет возможности использовать это ключевое событие.


person Viesturs    schedule 04.02.2009    source источник


Ответы (3)


Возможно, эта статья CodeProject может дать вам подсказку:

TabKeyIntercept - перехватить и обработать клавишу Tab в форме Windows.Forms

[...] К счастью, в базовом классе Form существует метод protected override bool ProcessTabKey(bool forward). Используя этот метод, мы можем перехватить и «потребить» клавишу Tab.

И, как оказывается, если возвращаемое значение метода ProcessTabKey() ложно, клавиша Tab действительно превращается в метод OnKeyDown (). Но, конечно, если ваш код «потребляет» клавишу Tab в методе ProcessTabKey(), вам, вероятно, не нужно будет обрабатывать его в методе OnKeyDown().

Кроме того, комбинация Control-Tab превращается в метод OnKeyDown().

Итак, зная эти вещи, мы готовы определить индивидуальное использование клавиши Tab - и мы можем закодировать форму, чтобы позволить пользователю использовать комбинацию Control-Tab для переключения между обычным использованием / значением клавиши Tab и наше индивидуальное использование.

person splattne    schedule 04.02.2009
comment
ProcessTabKey - это метод формы. Было бы очень неуклюже иметь настраиваемую форму, просто чтобы изменить поведение одного поля. - person Viesturs; 04.02.2009

Сам нашел решение - переопределить bool RichTextEdit.ProcessCmdKey (ref Message m, Keys keyData).

person Viesturs    schedule 04.02.2009

Вы говорите, что используете элемент управления RichTextEdit, но я предполагаю, что вы имеете в виду RichTextBox. В этом случае вы сможете установить AcceptsTab значение True, чтобы позволить ему обрабатывать клавишу табуляции.

person Matt Hamilton    schedule 04.02.2009
comment
Действительно? Как интересно! Я оставлю ответ здесь, чтобы другие, прочитавшие его, могли увидеть ваш комментарий и узнать, почему это не ответ. - person Matt Hamilton; 04.02.2009