Erstellen einer Schlüsselbindung in WPF mit mehr als einem Modifikatorschlüssel

74

Die Art und Weise, wie ich sie geschaffen habe, KeyBindingwar ungefähr so:

<KeyBinding Modifiers="Ctrl" Key="S" Command="{Binding SaveCommand}" />

Aber was ist, wenn ich zwei Modifikatortasten benötige? Zum Beispiel Ctrl+ Shift.

Jiew Meng
quelle

Antworten:

132

In der Dokumentation heißt es, dass Sie die Modifikatoren einfach durch das +Zeichen trennen können :

<KeyBinding Modifiers="Ctrl+Shift" Key="S" Command="{Binding SaveCommand}" />

Sehen Sie hier für die blutigen Details, mit den entsprechenden Bits im folgenden Fall extrahiert die Verbindung überhaupt verschwindet:


XAML

<object property="oneOrMoreModifierKeys"/>

XAML-Werte

oneOrMoreModifierKeys- Ein oder mehrere Modifizierertasten, die durch die ModifierKeysAufzählung definiert sind und durch ein +Zeichen getrennt sind.


Sie können auch eine eigene Geste anstelle einer Tasten- / Modifikatorkombination verwenden:

<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding SaveCommand}" />

gemäß demselben Dokumentationslink:

Beim Definieren einer KeyBinding in XAML gibt es zwei Möglichkeiten, die KeyGesture anzugeben.

Die erste Möglichkeit, eine Schlüsselbindung in XAML einzurichten, besteht darin, das Gestenattribut des Schlüsselbindungselements zu definieren, mit dessen Hilfe eine Syntax Schlüssel und Modifikatoren als einzelne Zeichenfolge angeben kann, z. B. "STRG + P".

Die zweite Möglichkeit besteht darin, das Schlüsselattribut und die Modifikatorattribute des KeyBinding-Elements zu definieren.

Beide Methoden zum Festlegen der KeyGesture sind gleichwertig und ändern dasselbe zugrunde liegende Objekt. Wenn beide verwendet werden, tritt jedoch ein Konflikt auf. Wenn die Attribute Key, Modifiers und Gesture festgelegt sind, wird das zuletzt definierte Attribut für die KeyGesture verwendet.

paxdiablo
quelle
Microsoft Docs: XAML-Syntax im Detail - Aufzählungsattributwerte : "KeyBinding.Modifiers ... Diese Eigenschaft ist ein Sonderfall, da die ModifierKeys-Aufzählung einen eigenen Typkonverter unterstützt. Der Typkonverter für Modifikatoren verwendet ein Pluszeichen (+). Diese Konvertierung unterstützt die traditionellere Syntax zur Darstellung von Tastenkombinationen in der Microsoft Windows-Programmierung, z. B. "Strg + Alt". " .
Pang
15
<KeyBinding Command="{Binding SaveCommand}"
            Gesture="Ctrl+Shift+S" />

Siehe die MSDN-Dokumentation, KeyBinding Class .

Aurelien Ribon
quelle
6

Ich weiß, dass die Frage für XAML ist, aber hier ist ein Beispiel, wenn Sie es im Code tun möchten (mehrere ModifierKeys können über logisches ODER angegeben werden):

new KeyBinding( SaveCommand, Key.S, ModifierKeys.Control | ModifierKeys.Shift )
KornMuffin
quelle
2

Hier ist mein Code zum Implementieren von Tastenkombinationen mit mehreren Zeichen, z. B. Alt+ P+ Ain WPF MVVM.

Fügen Sie dies Ihrer XAML hinzu (angehängtes Verhalten für das KeyDown-Ereignis):

cb:ShortCutBehavior.Command="{Binding Shortcuts.CmdKeyPressed}"

Fügen Sie dies Ihrem Ansichtsmodell hinzu:

ShortCuts Shortcuts = new ShortCuts( this );

//Add Plenty of shortcuts here until your heart is desired

Shortcuts.AddDoubleLetterShortCut( AddOrganization, Key.P, Key.A, ModifierKeys.Alt, true);
Shortcuts.AddSingleLetterShortCut( CmdAddNewAgreement, Key.A, ModifierKeys.Alt);

Dies sind zwei Beispiele für das Hinzufügen von Verknüpfungen. Die erste ist eine Doppelbuchstabenverknüpfung: Alt+ P+, Adie die Methode AddOrganization () ausführt, und die zweite ist eine Einzelbuchstabenverknüpfung: Alt+ A, die den ICommand CmdAddNewAgreemnt ausführt.

Sowohl AddDoubleLetterShortCut als auch AddSingleLetterShortCut sind überladen, um Aktionen oder ICommands zu akzeptieren.

Dies ist einer meiner ersten Versuche, etwas zu generieren, damit Sie die Idee aufgreifen und für Sie geeignet machen können.

Terence
quelle
0

Es mag zu spät sein, aber hier ist die einfachste und kürzeste Lösung.

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.S)
    {
         // Call your method here
    }
}

<Window x:Class="Test.MainWindow" KeyDown="Window_KeyDown" >
Jitendra Pancholi
quelle