2016-08-03 1 views
2

я получил некоторые сочетания клавиш, установленных на WPF Userpanel таким образом:Сочетания клавиш не всегда вызывая на UserControl WPF

<UserControl.../> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <mvvm:EventToCommand Command="{Binding Mode=OneWay, Path=CheckShortcutsCommand}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
... 

Это глобально работает excep, что команда CheckShortcutsCommand вызывается только тогда, когда фокус находится на контроле пользователя UserControl.

Поэтому, если я нажму на текстовое поле или список управления usercontrol и нажму клавишу клавиатуры, он вызовет команду. Если я нажму на фон usercontrol, это не вызовет его.

Является ли это ожидаемым поведением? Как я могу заставить команду запускаться, даже если никакой контроль не фокусируется (если я нажимаю на фон и нажимаю клавишу)?

Thx заранее

ответ

2

Так работает клавиатура. Если то, что вы на самом деле хотите, это иметь привязки клавиатуры, которые работают независимо от того, какой контроль в окне сфокусирован, вам нужно будет поместить их в окно.

<Window.InputBindings> 

    <KeyBinding Modifiers="Ctrl" Key="C" Command="{Binding CheckShortcutsCommand}" /> 

    <!-- More KeyBindings and MouseBindings here --> 

</Window.InputBindings> 

Если i:Interaction.Triggers действительно то, что вам нужно делать, вы бы сделать это так же, как у вас есть - но в Window, а не UserControl.

Если вы пытаетесь использовать свой UserControl в качестве средства добавления упакованной группы команд в произвольные окна, это аккуратная идея, и это выполнимо, но это неправильный способ сделать это в WPF.

Вы можете написать статический метод, который принимает ссылку на UserControl, находит «верхний уровень родителя с помощью VisualTreeHelper и копирует все из UserControl» The UserControl привязок ввода с до родителя верхнего уровня. Затем вы вызываете этот метод в событии UserControlLoaded. Сделайте это базовым классом, и вы можете выпустить десяток различных «пакетов команд» UserControls.

Вы также можете написать attached property, который добавляет набор команд к оконным InputBindings:

<Window 
    ...etc.... 
    myProps:AddFooBarCommands="True" 
    ...etc.... 
    > 
    ...etc.... 
+0

Большое спасибо Ed! Переключение кода KeyBinding в окно отлично сработало. :) –

0

Вероятно, не самое надежное решение, но если фон вашего UserControl является «кликабельны» вы могли бы применить фокус на одном из элементов управления внутри него так, что горячие клавиши работают?

Смежные вопросы