KeyDown распознает клавиши со стрелками влево и вправо, но не вверх и вниз
С кодом ниже, клавиши со стрелками влево и вправо функционируют как ожидалось, но стрелки вверх и вниз не распознаются (шагая через него, первые два условия выполняются там, где это необходимо, но вторые два никогда не являются):
private void textBox1_KeyDown(object sender, KeyEventArgs e) {
TextBox tb = (TextBox)sender;
if (e.KeyCode.Equals(Keys.Left)) {
SetFocusOneColumnBack(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Right)) {
SetFocusOneColumnForward(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Up)) {
SetFocusOneRowUp(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Down)) {
SetFocusOneRowDown(tb.Name);
e.Handled = true;
return;
}
}
почему это должно быть, и как я могу это исправить?
обновление
вот что я вижу, когда я парю над e.Keycode пока шагающ до конца. Если я нажму
- ...Стрелка влево, я вижу:
e.KeyCode = "LButton | MButton | Space"
- ...Стрелка вправо, я вижу:
e.KeyCode = "LButton | RButton | MButton | Space"
- ...Стрелка вверх, я вижу:
e.KeyCode = "RButton | MButton | Space"
- ...Стрелка вниз, я вижу:
e.KeyCode = "Backspace | Space"
Это меня озадачило (что он показывает мне), но на keyleft и keyright мой код вводится - он никогда не для keyup и keydown, независимо от того, как сильно я сжимаю зубы.
4 ответов
Windows захватывает определенные клавиши для навигации по пользовательскому интерфейсу, прежде чем они будут отправлены в вашу форму. Если вы хотите переопределить это поведение, вам нужно перегрузить IsInputKey
метод (и подкласс текстового поля):
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Right)
return true;
return base.IsInputKey(keyData);
}
Я считаю, что использование PreviewKeyDown работает (мне пришлось удалить " e.Handled = true " код, поскольку он не применяется в событии PreviewKeyDown):
private void textBoxQH1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
TextBox tb = (TextBox)sender;
if (e.KeyCode.Equals(Keys.Up)) {
SetFocusOneRowUp(tb.Name);
return;
}
if (e.KeyCode.Equals(Keys.Down)) {
SetFocusOneRowDown(tb.Name);
return;
}
}
Итак, для обработки различных клавиш, которые я искал, были необходимы три разных события: нажатие клавиш для обычных символов, KeyDown для не-символов (клавиши со стрелками влево и вправо) и этот (PreviewKeyDown) для клавиш со стрелками вверх и вниз.
вы можете использовать этот код:
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
//Do stuff
break;
case Keys.Down:
//Do stuff
break;
case Keys.Left:
//Do stuff
break;
case Keys.Right:
//Do stuff
break;
}
}
ну, слишком поздно для партии, но если кого-то интересует, используйте e.KeyValue
вместо этого, например, e.KeyValue
для клавиши со стрелкой влево -37
и клавишу со стрелкой вправо,39
и так далее.