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();
}
}
}
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
@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
itshos Kommentar hat dies für mich funktioniert, konnte den obigen XML-Code nicht funktionieren. – eightx2