2009-05-16 26 views
19

Ich möchte Enter-Taste als Tab-Taste in meiner gesamten WPF-Anwendung, dh überall in meiner Anwendung zu interpretieren, wenn Benutzer die Eingabetaste drücken Ich möchte das nächste fokussierbare Steuerelement fokussieren, außer wenn die Schaltfläche fokussiert ist. Gibt es eine Möglichkeit, dies im Anwendungslebenszyklus zu tun? Kann mir jemand ein Beispiel geben?
Vielen Dank!
Interpretieren als Registerkarte eingeben WPF

+1

Babysmash von Scott Hanselman verwendet einig Keyboard überschreibt – bendewey

Antwort

35

Sie können meinen Code EnterKeyTraversal attached property verwenden, wenn Sie möchten. Fügen Sie es zu den Top-Level-Container auf einem WPF-Fenster, und alles wird innen behandeln, als Tab eingeben:

<StackPanel my:EnterKeyTraversal.IsEnabled="True"> 
    ... 
</StackPanel> 
+0

das Problem, das ich bin vor, dass, wenn der Fokus auf einem Knopf kommt, ich will, um den Befehl auszuführen und unterwegs Index der nächsten Registerkarte Ist das möglich? –

0

woodyiii, Es gibt eine Funktion in der UIElementPredictFocus() genannt, der durch seinen Namen seine Funktion kennen, dann können Sie Überprüfen Sie, ob dieses Element aktiviert ist oder nicht, um den Fokus darauf zu verschieben oder nicht ...

3

Ich habe das Problem von Woodyiii gelöst, indem ich ein FrameworkElement.Tag (dessen Wert IgnoreEnterKeyTraversal ist) zu bestimmten Elementen (Buttons, Comboboxen, oder irgendetwas, das ich die Enter-Schlüsselüberquerung ignorieren möchte) in meinem XAML. Ich suchte dann nach diesem Tag & Wert in der angefügten Eigenschaft. Wie so:

if (e.Key == Key.Enter) 
    { 
     if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal") 
     { 
      //ignore 
     } 
     else 
     { 
      e.Handled = true; 
      ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
     } 
    } 
+0

Stellen Sie sicher, dass dies im 'KeyDown'-Event und nicht in' PreviewKeyDown' erfolgt oder das Caret sich nicht bewegt. Sie geben auch nicht an, was '' ue' 'ist, aber für mich muss es 'e.Quelle' sein. – Conrad

+1

Das ist gut. Es funktioniert auf TextBox, wenn es Tag = "IgnoreEnterKeyTraversal" aber ich möchte das gleiche auf ComboBox mit IsEditable = "True". In diesem Szenario funktioniert dein Trick nicht. Können Sie mir sagen, wie kann ich das tun? – Vishal

4

Um es ganz Projekt ändern müssen Sie diese

  • In App.xaml.cs tun:

    protected override void OnStartup(StartupEventArgs e) 
    {   
        EventManager.RegisterClassHandler(typeof(Grid), Grid.PreviewKeyDownEvent, new KeyEventHandler(Grid_PreviewKeyDown)); 
        base.OnStartup(e); 
    } 
    
    private void Grid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
        var uie = e.OriginalSource as UIElement; 
    
        if (e.Key == Key.Enter) 
        { 
         e.Handled = true; 
         uie.MoveFocus(
         new TraversalRequest(
         FocusNavigationDirection.Next)); 
        } 
    } 
    
  • Compile. Und es getan. Jetzt können Sie Enter wie Tab verwenden. Hinweis: Diese Arbeit für Elemente im Raster

Verwandte Themen