2016-07-04 19 views
0

Ich verwende CommandBinding bis RoutedUICommand in meiner Anwendung ausgiebig. Die meisten von ihnen haben Tastaturkürzel, die global funktionieren.WPF RoutedUICommand: Wie kann man einen Schlüssel eingeben, der als Verknüpfung registriert ist?

Für einige der Befehle würde ich gerne Tastenkombinationen ohne Tastenkombinationen haben - zum Beispiel die Tastatur '+' (Key.Add). Dies alles funktioniert gut, außer dass, wenn ein Texteingabesteuerelement (z. B. TextBox) fokussiert ist, der globale Befehl immer noch Vorrang hat, den Schlüssel konsumiert und nicht erlaubt, dass er eingegeben wird, indem stattdessen der Befehl ausgeführt wird. Trotzdem möchte ich unter solchen Umständen den Schlüssel eingeben und die Befehlsverknüpfung blockieren.

Gibt es eine relativ einfache Möglichkeit, das zu erreichen?

Antwort

1

Rufen Sie in Ihrem CanExecute-Delegaten die Eigenschaft Keyboard.FocusedElement auf, geben Sie false zurück, wenn es nicht null ist. Theoretisch sollte es funktionieren. Wenn es nicht funktioniert, tun Sie es in Execute delegate, und überprüfen Sie dies und setzen Sie e.Handled auf false.

+0

Nein, beide Wege funktionieren nicht. Der Tastendruck wird auch dann verbraucht, wenn 'CanExecute' falsch oder 'Executed' nicht Handled signalisiert wurde. (Außerdem kann 'Keyboard.FocusedElement' legitimerweise auf viele andere Elemente gesetzt werden, die den Schlüssel nicht verarbeiten müssen; z. B.' RadioButton'). Eine Problemumgehung, die ich bisher gefunden habe, besteht darin, den fraglichen Befehl an das relevante Panel oder ein anderes Element ('TabItem' in meinem Fall) zu binden, das keine editierbaren Felder enthält, und nicht das gesamte Fenster oder die Anwendung. Dies ist keine universelle Lösung, kann aber in den meisten Fällen funktionieren. – Zeus