0

Учебная задача. Написание клавиатурного тренажёра. Пользователю на экран выводится строка, и он должен нажать клавиши из неё на клавиатуре. С большинством клавиш всё решилось при помощи добавления в Window

KeyDown="Key_Down_Handler"

Возникла проблема с тем, что пробел таким способом обработать не получается. Если никакой элемент не выбран, то он сработает, но если выбран, то он либо ничего не делает, либо, если выбрана какая-то кнопка, жмёт на неё. Мне же нужно, что бы при нажатии на пробел срабатывала функция, например DoSomething()

Пробовал делать через Window.InputBindings

<Window.InputBindings>
    <KeyBinding ????="DoSomething" Key="Space"/>
</Window.InputBindings>

Но не смог разобраться как связать нажатие кнопки с нужным методом. И плюс ещё нужно что бы не срабатывал стандартный функционал пробела, нажатие на выделенный элемент. Тоже самое и с клавишей Enter. Как то можно сделать, что бы при нажатии этих клавиш в любом месте приложения срабатывала функций DoSomething и не срабатывало нажатие на выделенный элемент?

Pavel
  • 7
  • 5

1 Answers1

0

Нужно использовать событие PreviewKeyDown на уровне окна (оно транслируется вниз по иерархии визуального дерева). В обработчике устанавливать KeyEventArgs.Handled=true, чтобы не срабатывала стандартная обработка контролов.

  • Спасибо огромное. Это именно то что нужно. – Pavel Dec 28 '22 at 14:44
  • @ПавелСпасский Костыль, не делайте так. Есть у контролов IsHittestVisible раз уж на то пошло. WPF != Winforms, здесь на обработчиках далеко не уедешь. – aepot Dec 29 '22 at 08:40
  • IsHitTestVisible закроет вообще все input events. А если человеку надо перехватить и заблокировать именно клавиатурные события, причем от определенных клавиш, и оставить все события мыши? –  Dec 29 '22 at 11:13
  • Не вижу в вопросе того, о чем вы говорите. И не могу представить такую ситуацию, когда нужно перехватить только клаву, а мышь оставить. Видимо разработчики WPF тоже не представили и не ввели поддержку таких фокусов на уровне конфигурации контрола. Опять же, в особо упоротых случаях можно смастерить свой собственный юзерконтрол и вертеть его поведение как душе угодно. – aepot Dec 29 '22 at 15:55