2009-09-01 13 views
107

Ich weiß über die Verwendung von _ anstelle von &, was ich sehe, ist die Ctrl + Art Verknüpfungen.Tastaturkürzel in WPF

Ctrl +Z für Undo, Ctrl +S für speichern usw.

Gibt es eine 'Standard' Art und Weise dieses in WPF-Anwendungen für die Implementierung? Oder ist es ein Fall von eigenen Rollen und verdrahten sie, was auch immer Befehl/Kontrolle?

Antwort

149

Ich verstehe den Standard Weg ist durch Erstellen von Befehlen und dann Hinzufügen von Tastenkombinationen zu ihnen als InputGestures. Dadurch können die Tastenkombinationen funktionieren, auch wenn sie nicht an Steuerelemente angeschlossen sind. Und da Menüeinträge Tastaturgesten verstehen, werden sie automatisch Ihre Tastenkombination im Menüelementtext anzeigen, wenn Sie diesen Befehl an Ihren Menüeintrag anhängen.

A. Erstellen statisches Attribut Befehl zu halten (vorzugsweise als Eigenschaft in statische Klasse, die Sie für Befehle erstellen - aber für einfaches Beispiel mit nur statisches Attribut in Fenster CS-):

public static RoutedCommand MyCommand = new RoutedCommand(); 

B. In der Shortcut-Taste (n), die Methode aufrufen sollte:

MyCommand.InputGestures.Add(new KeyGesture(Key.S , ModifierKeys.Control)); 

C. erstellen Befehl Bindung, die Punkte auf Ihre Methode aufrufen ausführen, setzen sie diese in den Befehlsbindungen für das UI-Element, unter denen es sollte funktionieren (zB , das Fenster) & die Methode:

<Window.CommandBindings> 
    <CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/> 
</Window.CommandBindings> 

private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... } 
+2

Wie verknüpfe ich den Befehl mit einem Menüelement? Sicherlich wäre das die wichtigste Information, die in diese Antwort aufgenommen wird, aber sie fehlt. – Timwi

+7

@Timwi: Ich habe den obigen Code auf diese Weise verwendet, um einem vorhandenen Ereignis eine Tastenkombination hinzuzufügen: RoutedCommand cmndSettings = new RoutedCommand(); cmndSettings.InputGestures.Add (neue KeyGesture (Key.S, ModifierKeys.Control)); CommandBindings.Add (neues CommandBinding (cmndSettings, mnuSettings_Click)); – itsho

+1

itshos Kommentar hat dies für mich funktioniert, konnte den obigen XML-Code nicht funktionieren. – eightx2

9

Es hängt davon ab, wo Sie diese verwenden möchten. TextBoxBase abgeleitete Steuerelemente implementieren diese Verknüpfungen bereits. Wenn Sie benutzerdefinierte Tastaturkürzel verwenden möchten, sollten Sie sich die Befehle Befehle und Eingaben ansehen. Hier ist ein kleines Tutorial von Switch on the Code: WPF Tutorial - Command Bindings and Custom Commands

Hoffe das hilft.

+5

Was für ein Mist Tutorial - erklärt nicht die absolut wichtigste Sache von allen, wie man einen Befehl verwendet, der nicht zufällig einer ihrer vordefinierten Satz von 20 "gemeinsamen" Befehlen ist. – Timwi

+3

Leider sieht es so aus, als wäre der Link tot. –

2

VB.Net:

Public Shared SaveCommand_AltS As New RoutedCommand 

Innen geladen Veranstaltung:

SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control)) 

Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save)) 

Kein XAML benötigt.

Hoffe, das hilft.

-2

Wie der Befehl mit einem MenuItem zuzuordnen:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/> 
11

diesen Code Versuchen ...

zunächst eine RoutedComand erstellen Objekt

RoutedCommand newCmd = new RoutedCommand(); 
    newCmd.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control)); 
    CommandBindings.Add(new CommandBinding(newCmd, btnNew_Click)); 
3

Dokumentieren Sie diese Antwort für andere, da es eine viel einfachere Art und Weise, dies zu tun, die nur selten Bezug genommen wird, und erfordert nicht die XAML überhaupt zu berühren.

Um eine Tastenkombination zu verknüpfen, fügen Sie einfach im Window-Konstruktor der InputBindings-Auflistung eine neue KeyBinding hinzu. Übergeben Sie als Befehl Ihre beliebige Befehlsklasse, die ICommand implementiert. Für die Execute-Methode implementieren Sie einfach die von Ihnen benötigte Logik. In meinem Beispiel unten nimmt meine WindowCommand-Klasse einen Delegaten, der bei jedem Aufruf ausgeführt wird. Wenn ich das neue WindowCommand konstruiere, um mit meiner Bindung zu übergeben, zeige ich einfach in meinem Initialisierer die Methode an, die ich das WindowCommand ausführen soll.

Sie können dieses Muster verwenden, um Ihre eigenen schnellen Tastenkombinationen zu erstellen.

Erstellen Sie eine einfache WindowCommand-Klasse, die einen Ausführungsdelegaten zum Abfeuern aller darauf gesetzten Methoden akzeptiert.

public class WindowCommand : ICommand 
{ 
    private MainWindow _window; 

    //Set this delegate when you initialize a new object. This is the method the command will execute. You can also change this delegate type if you need to. 
    public Action ExecuteDelegate { get; set; } 

    //You don't have to add a parameter that takes a constructor. I've just added one in case I need access to the window directly. 
    public WindowCommand(MainWindow window) 
    { 
     _window = window; 
    } 

    //always called before executing the command, mine just always returns true 
    public bool CanExecute(object parameter) 
    { 
     return true; //mine always returns true, yours can use a new CanExecute delegate, or add custom logic to this method instead. 
    } 

    public event EventHandler CanExecuteChanged; //i'm not using this, but it's required by the interface 

    //the important method that executes the actual command logic 
    public void Execute(object parameter) 
    { 
     if (ExecuteDelegate != null) 
     { 
      ExecuteDelegate(); 
     } 
     else 
     { 
      throw new InvalidOperationException(); 
     } 
    } 
} 
+0

Super. Es funktioniert perfekt für mein Szenario ... – Geeth

1

Ich hatte ein ähnliches Problem, und fand @ Aliwa die Antwort, um die hilfreichste und eleganteste Lösung zu sein; Ich benötigte jedoch eine bestimmte Tastenkombination, Ctrl + 1. Leider bekam ich folgende Fehlermeldung:

'1' cannot be used as a value for 'Key'. Numbers are not valid enumeration values.

Mit etwas weiteren suchen, ich modifizierte Antwort des @ Aliwa auf die folgenden:

<Window.InputBindings> 
    <KeyBinding Gesture="Ctrl+1" Command="{Binding MyCommand}"/> 
</Window.InputBindings> 

fand ich das ich jede Kombination für ziemlich gut zu funktionieren groß benötigt .