2016-08-03 10 views
2

ich einige Tastenkombinationen bekam Set auf einem WPF Userpanel auf diese Weise:Tastenkombinationen nicht immer Triggern auf einem WPF-Usercontrol

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

Es global arbeitet excep, dass der CheckShortcutsCommand Befehl nur aufgerufen wird, wenn der Fokus auf einem Steuerelement ist des Benutzersteuerelements.

Wenn ich also auf ein Textfeld oder eine Listbox des Benutzersteuerelements klicke und eine Tastaturtaste drücke, wird der Befehl ausgelöst. Wenn ich auf den Benutzerkontrollhintergrund klicke, wird es nicht ausgelöst.

Ist dies das erwartete Verhalten? Wie kann ich den Befehl auslösen lassen, auch wenn kein Steuerelement fokussiert ist (wenn ich auf den Hintergrund klicke und einen Schlüssel drücke)?

Thx im Voraus

Antwort

2

So funktioniert der Tastaturfokus. Wenn das, was Sie eigentlich wollen, Tastaturbindungen haben soll, die funktionieren, unabhängig davon, welches Steuerelement im Fenster fokussiert ist, müssen Sie sie in das Fenster einfügen.

<Window.InputBindings> 

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

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

</Window.InputBindings> 

Wenn i:Interaction.Triggers wirklich ist, was Sie brauchen, zu tun, die Sie tun würden, wie Sie es haben - aber in der Window, nicht die UserControl.

Wenn Sie versuchen, Ihre UserControl als ein Mittel zum Hinzufügen einer Paketgruppe von Befehlen zu beliebigen Fenstern zu verwenden, ist das eine nette Idee, und es ist machbar, aber das ist der falsche Weg, es in WPF zu tun.

Sie könnten eine statische Methode schreiben, die einen Verweis auf ein UserControl nimmt, findet der UserControl ‚s Top-Level-Eltern über VisualTreeHelper und kopiert alle von der UserControl‘ s Eingabebindungen auf der obersten Ebene Eltern. Dann würden Sie diese Methode im UserControlLoaded Ereignis aufrufen. Machen Sie das zu einer Basisklasse und Sie könnten ein Dutzend verschiedene "command package" UserControls ausprobieren.

Sie könnten auch eine attached property schreiben, die eine Reihe von Befehlen an ein InputBindings Das Fenster fügt hinzu:

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

Vielen Dank Ed! Das Umschalten des KeyBinding-Codes auf das Fenster hat den Trick perfekt gemacht. :) –

0

Wahrscheinlich nicht die robusteste Lösung, aber wenn Hintergrund Ihrer Usercontrol „klickbare“ ist man den Fokus auf eines der Steuerelemente in der es so, dass die Tastenkombinationen funktionieren anwenden könnten?