2009-05-01 9 views
60

Was würde + Tab und Ctrl +Umschalt +Tab für eine WPF-Anwendung einige Beispiel-Code, das wird Falle der Ctrl sein?Wie erfassen Sie Strg + Tab und Strg + Umschalt + Tab in WPF?

Wir haben KeyDown Ereignisse erstellt und auch versucht, Befehlsbindungen mit Eingabe Gesten hinzuzufügen, aber wir konnten nie diese beiden Verknüpfungen abfangen.

Antwort

91

Welchen KeyDown-Handler hatten Sie? Der folgende Code funktioniert für mich. Die eine, die mir Mühe gibt, ist: Alt + Tab, aber Sie haben nicht um, dass: D

public Window1() 
{ 
    InitializeComponent(); 
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
} 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
    { 
     MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
    } 

    if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     MessageBox.Show("CTRL + TAB trapped"); 
    } 
} 
+0

Siz dank hinzugefügt werden ... die Arbeit für unsere WPF tut. Wir haben auch ein XBAP, für das wir das abfangen müssen, und es scheint nicht auf dem XBAP zu funktionieren. Irgendwelche Ideen, wie man das auch mit einem XBAP macht? – FarrEver

+1

Gibt es einen xamly Weg, es zu tun? – Shimmy

+13

@siz Sie können Ihre If-Anweisungen bereinigen, indem Sie die folgende Syntax verwenden: 'Keyboard.Modifiers.HasFlag (ModifierKeys.Control)' – Pakman

8

Sie haben KeyUp Ereignis verwenden, nicht KeyDown ...

+2

Interessant. Habe das nicht versucht, aber kannst du bitte erklären warum? –

+7

Sicher Siz. Wenn Sie versuchen, zwei oder mehr Tastenanschläge gleichzeitig zu erfassen, können Sie die KeyDown-Überprüfung für e.Key nicht verwenden, da jeweils ein Schlüssel erfasst wird. Wenn KeyDown erforderlich ist, z. B. wenn der Benutzer eine Tastenkombination gedrückt hält, sollten Sie KeyDown und die Keyboard-Klasse, insbesondere IsKeyDown(), verwenden, um nach bestimmten Schlüsseln zu suchen. –

+1

Entschuldigung, ich verstehe nicht, was Sie hier sagen wollen. Das KeyUp-Ereignis übergibt auch nur einen einzelnen Schlüsselwert in e.Key. Können Sie ein konkretes Beispiel geben, in dem die Handhabung von KeyUp anstelle von KeyDown besser wäre, um "2 oder mehr Tastenanschläge gleichzeitig zu erfassen"? Vielen Dank. –

30

Gustavos Antwort war genau das, wonach ich suchte. Wir wollen Eingabetaste bestätigen, aber immer noch das Einfügen erlauben:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
     return; 
} 
+0

Leider wird dies nicht funktionieren, wenn der Benutzer die rechte Strg - Taste verwendet :-) –

1

Hallo Sie diese auf keydown Ereignisse verwenden können

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      // 
      // TODO: somthing here 
      // 
     } 
    } 
+0

Das Problem hier ist auch, dass, wenn ich eine weitere If - Anweisung mit (Keyboard.IsKeyDown (Key.LeftCtrl) && Keyboard.IsKeyDown (Key.Tab)). Beide Anweisungen werden ausgeführt, wenn ich Ctrl + Shift + Tab – Devid

+0

drücke, in diesem Fall können Sie cancel = true; in beiden Anweisungen, wenn Sie Strg + Shift + Tab drücken – luka

1

Arbeitsversion Szymon Rozga Antwort (sorry, kann ich nicht kommentieren). Wir schauen nicht auf Alt, aber es ist Buchhaltung kann einfach auf den ersten wenn

public View() 
    { 
    InitializeComponent(); 
    AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent); 
    } 

    private void controlKeyDownEvent(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
    { 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
     else 
      MessageBox.Show("CTRL + TAB trapped"); 
    } 
    }