Как перехватить нажатие клавиши 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