2017-01-13 4 views
0

Ich habe eine bestehende WPF-Anwendung, in der ich ein ziemlich fortgeschrittenes Befehlssystem habe. Ich entwickle jetzt eine WinForms-Anwendung, in der ich ein ähnliches Befehlssystem übernehmen möchte. Das läuft gut, aber ich kämpfe mit Shortcuts und der verbindlichen Übersetzung.InputBinding für Windows Forms

Für den WPF Fall binde ich Schlüssel Gesten für Befehle an Elementen der Benutzeroberfläche über das folgende Verfahren

public void BindKeyGestures(UIElement uiElement) 
{ 
    foreach (var keyboardShortcut in _keyboardShortcuts) 
    { 
     if (keyboardShortcut.KeyGesture != null) 
     { 
      uiElement.InputBindings.Add(new InputBinding(
       _commandService.GetTargetableCommand(_commandService.GetCommand(keyboardShortcut.CommandDefinition)), 
       keyboardShortcut.KeyGesture)); 
     } 
    } 
} 

Gibt es eine Möglichkeit InputBindings für einen WinForms hinzufügen Control (ich glaube, dies unwahrscheinlich ist, wie es ist ein WPF-Konstrukt), und wenn nicht, wie kann ich die Verknüpfung hinzufügen, ohne ProcessCmdKey des enthaltenden Formulars explizit zu überschreiben?

+0

Der Hauptgrund für WPF alle WinForms Einschränkungen ist ... – Phil1970

+0

Ich verstehe und stimme mit Ihnen überein. Aber leider habe ich keine andere Möglichkeit, als WinForms zu verwenden: '[für dieses Projekt. – MoonKnight

Antwort

1

Es gibt einige spezielle Steuerelemente (Toolstrip-Elemente, Menüelemente) mit einer ShortcutKeys-Eigenschaft, die Sie verwenden können (z. B .: https://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripmenuitem.shortcutkeys(v=vs.110).aspx).

Für andere Steuerelemente gibt es nichts, was ich kenne, und Sie müssen ein System selbst erstellen. Hier ist eine einfache Erweiterung Methode, die Sie verwenden können:

public static void Bind(this Control control, Keys shortcut, Action action) 
    { 
     Form form = control.FindForm(); 
     if (form == null) throw new NullReferenceException($"Form not found for control: {control.Text ?? control.ToString()}"); 
     form.KeyPreview = true; 
     form.KeyDown += (sender, args) => 
     { 
      if (args.KeyData == shortcut) action(); 
     }; 
    } 

Dies aufgerufen werden muss, nachdem die Steuerung zu einem Formular zugeordnet ist, sonst wäre es eine Ausnahme werfen. Dies schließt auch nicht das Abmelden des KeyDown-Ereignisses aus, das weniger einfach zu implementieren sein wird (etwas wie das Zwischenspeichern der Control + Shortcut + Delegate-Triplets und dann das Abmelden beim Aufruf von Unbind).

Der obige Code kann wie folgt verwendet werden:

Button button = new Button { Text = "Click Me!" }; 
form.Controls.Add(button); 
.... 
button.Bind(Keys.F | Keys.Control,() => doSomething()); //Will do something on Ctrl+F