Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Работа с radioButton'ом в C# WinForms

#c_sharp #winforms


Пишу программу, где нужно использовать клавиши "влево" и "вправо". Нужно выбирать
правильный ответ и переключать клавишей "влево" или "вправо" для перехода к другому
вопросу. Все работает, только есть одна проблема, когда наживаешь клавишу с клавиатуры,
она сначала переключает значение  radioButton'а, а уже потом переходит к другому вопросу. 

Возможно ли задать какое-то свойство для  radioButton'а, чтобы он не реагировал на
клавиатуру?
    


Ответы

Ответ 1



попробуй у всех радиобаттонов установить кейдаун ивент на этот метод (не нужно его дублировать -- у всех на один и тот же метод) private void radioButton1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == System.Windows.Forms.Keys.Left || e.KeyCode == System.Windows.Forms.Keys.Right || e.KeyCode == System.Windows.Forms.Keys.Up || e.KeyCode == System.Windows.Forms.Keys.Down) e.SuppressKeyPress = true; } Пока в фокусе элемент подписанный на такой обработчик, клавиши просто игнорируются. Совсем. Никакие другие обработчики не вызываются.

Ответ 2



Такое В WinForms не сделать. По крайней мере, с ходу. Максимум чего можно добиться без "танцев с бубном" - отключение перехода по клавише Tab с помощью свойства TabStop. Но, оно не действует на клавиши "со стрелками". Советую посмотреть в сторону WPF. Там возможностей больше.

Ответ 3



Если у клавиш со стрелками единственное назначение на форме (или контроле-контейнере), то можно перехватить и обработать их на уровне формы, не передавая события от этих клавиш вложенным контролам. Делается это довольно просто, достаточно у формы переопределить метод обработки клавиш: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (keyData) { case Keys.Left: //код переключения на предыдущий вопрос return true; case Keys.Right: //код переключения на следующий вопрос return true; default: //для всех остальных клавиш оставляем базовую обработку return base.ProcessCmdKey(ref msg, keyData); } } Есть еще одно альтернативное решение с использованием MenuStrip, оно описано в этом ответе. Если в вашей программе используется меню, то этот вариант возможно будет интересен.

Комментариев нет:

Отправить комментарий