Как перехватить нажатие клавиши TAB для предотвращения стандартного изменения фокуса в C#

Обычно, нажимая клавишу TAB, вы переключаете фокус на следующий элемент управления в заданном порядке табуляции. Я хотел бы предотвратить это и заставить клавишу TAB делать что-то еще. В моем случае я хотел бы изменить фокус с комбинированного списка на совершенно другой элемент управления. Я не могу сделать это, установив порядок вкладок. Мне нужно сделать это программно. Есть идеи как? Похоже, что события KeyDown и KeyPress не могут правильно обрабатывать клавишу TAB. Благодарю.

5 ответов

Решение

Override ProcessDialogKey или же ProcessTabKey в вашей форме и сделайте логику, которую вы хотите, в зависимости от того, какой элемент управления сфокусирован.

Основываясь на предложении JRS об использовании события PreviewKeyDown, это передает нажатие клавиши через элемент управления:

private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Tab)
        e.IsInputKey = true;
}

Затем вы можете обработать событие KeyDown элемента управления, если вы хотите настроить поведение:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab)
    {
        MessageBox.Show("The tab key was pressed while holding these modifier keys: "
                + e.Modifiers.ToString());
    }
}

Альтернатива TextBoxBase

Если элемент управления получен из TextBoxBase (т.е. TextBox или же RichTextBox), с Multiline свойство установлено в true, то вы можете просто установить AcceptsTab собственность на true,

Свойство TextBoxBase.AcceptsTab

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

Вы можете попробовать этот код на своем KeyDown событие:

if (e.KeyCode == Keys.Tab) {
  //your logic
  e.SuppressKeyPress = true;
}

Если нажата кнопка "Tab", сделайте любую нужную логику, затем вызовите SuppressKeyPress остановить KeyPress событие от запуска и вызова обычной логики Tab для вас.

Переопределите событие LostFocus элемента управления, см. Ссылку ниже для примеров:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

Так как я создаю UserControl, я использовал PreviewKeyDown событие на контроле. Это избавляет от необходимости обрабатывать события нажатия клавиш в форме хоста.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

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