2009-05-16 15 views
19

Chcę zinterpretować klawisz Enter jako klawisz Tab w całej mojej aplikacji WPF, tj. Wszędzie w mojej aplikacji, gdy użytkownik naciśnie klawisz Enter Chcę ustawić ostrość następnego elementu sterującego, z wyjątkiem sytuacji, gdy przycisk jest skupiony. Czy jest jakiś sposób na zrobienie tego w kręgu życia aplikacji? Czy ktoś może dać mi przykład?
Wielkie dzięki!
Interpretuj jako zakładkę WPF

+1

BabySmash Scott Hanselman wykorzystuje niektóre klawiatura zastępuje – bendewey

Odpowiedz

35

Możesz użyć mojego kodu EnterKeyTraversal attached property, jeśli chcesz. Dodaj go do kontenera najwyższego poziomu w oknie WPF i wszystko wewnątrz potraktuje wprowadzić taką kartę:

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

problem jestem stoi to, że gdy ostrość przychodzi na przycisku, chcę wykonać polecenie i przenieść na następny indeks kart. Czy to możliwe? –

0

woodyiii, Istnieje funkcja w UIElement nazywa PredictFocus() który według jego nazwy znać swoją funkcję, to można sprawdź czy ten element jest włączony, czy nie, aby przenieść fokus do niego, czy nie ...

3

Mam problem z woodyiii przez dodanie FrameworkElement.Tag (którego wartość jest IgnoreEnterKeyTraversal) do niektórych elementów (przyciski, comboboxes, lub coś, co chcę zignorować przejście klawisza Enter) w moim XAML. Następnie szukałem tej wartości znacznika & w załączonej właściwości. Tak:

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

Upewnij się, że zrobisz to w zdarzeniu "KeyDown', a nie' PreviewKeyDown' lub karetka się nie poruszy. Ponadto nie określa się, czym jest 'ue', ale przynajmniej dla mnie musi to być' e.Source'. – Conrad

+1

To dobrze. Działa na TextBox, jeśli ma Tag = "IgnoreEnterKeyTraversal", ale chcę to samo na ComboBox z IsEditable = "true". W tym scenariuszu Twoja sztuczka nie działa. Czy możesz mi powiedzieć, jak mogę to zrobić? – Vishal

4

Aby zmienić go w całym projekcie, którą musisz zrobić to

  • W App.xaml.cs:

    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)); 
        } 
    } 
    
  • skompilować. I zrobiłem to. Teraz możesz użyć karty Enter like. Uwaga: Ta praca dla elementów w siatce

Powiązane problemy