У меня есть 5 кнопок в приложении для Windows. При нажатии клавиши со стрелками фокус изменения между кнопками, а затем стрельба толькоЗапуск события KeyUp от следующего управления
KeyUp
событие. Как остановить это?
У меня есть 5 кнопок в приложении для Windows. При нажатии клавиши со стрелками фокус изменения между кнопками, а затем стрельба толькоЗапуск события KeyUp от следующего управления
KeyUp
событие. Как остановить это?
Подпишитесь на мероприятие PreviewKeyDown
.
Происходит перед событием KeyDown, когда нажата клавиша, когда фокус находится на этом элементе управления.
При перемещении по кнопкам параметр sender
будет содержать ранее выбранную кнопку.
Я нашел решение, которое должно работать для вас, адаптированный here. По-видимому, MS решила, что клавиши со стрелками не вызовут событие KeyDown
, поэтому вы не можете их отменить.
Одним из способов является указание, что ваши клавиши со стрелками являются нормальными клавишами ввода, как и любой другой ключ. Затем загорится событие KeyDown
, и вы можете отменить нажатие кнопки, если хотите.
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
e.IsInputKey = true;
}
private void button1_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
Вы можете прочитать другие ответы и комментарии в that post, чтобы посмотреть, что будет работать лучше в вашей ситуации.
Можете ли вы сказать, что я должен делать в PreviewKeyDown, чтобы остановить перемещение фокуса до следующего элемента управления? –
Думаю, я вижу, что вы сейчас пытаетесь сделать. Я отредактировал свой ответ. –
Да, это то, что мне нужно. Но я нашел это, прежде чем вы отправили сообщение. В любом случае, хорошо, чтобы показать ответ. –
Ответ на Ваш вопрос в комментарии
void button1_LostFocus(object sender, EventArgs e)
{
button1.Focus();
}
Он только фокусирует кнопку1 каждый раз.На самом деле я хочу сосредоточиться на кнопке, в которой я нажал клавишу со стрелкой. –
Чтобы предотвратить Up от перемещения фокуса от Button
вы должны использовать как минимум 3 метода:
bool _focus;
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Up)
_focus = true;
}
private void button1_KeyUp(object sender, KeyEventArgs e)
{
_focus = false;
}
private void button1_Leave(object sender, EventArgs e)
{
if(_focus)
button1.Focus(); // or (sender as Control)
}
Trick является использование флага, когда нажмите Вверх и вернуть фокус в Leave
. Вы должны развязать в KeyUp
, иначе было бы невозможно изменить фокус (нажав Tab в пример).
Вы можете поменять флаг в Leave
, я не тестировал его.
Вы хотите остановить событие «KeyUp» от стрельбы? Или вы хотите, чтобы какое-то другое событие, например «KeyDown», срабатывало? –
Я хочу, чтобы событие KeyUp было запущено с точной кнопки, которая имела фокус, когда я нажал клавишу со стрелкой. –
Это поведение по умолчанию. Когда вы нажмете клавишу со стрелкой, фокус изменится на следующий элемент управления, а затем вы отпустите клавишу, чтобы вы получили событие KeyUp от следующей кнопки. Если вы не отпустите ключ в течение длительного времени, он продолжит смену фокуса от одного к другому, а когда вы отпустите ключ, вы получите событие KeyUp из целенаправленного управления. – Sameer