2009-05-16 9 views
19

Quiero interpretar la tecla Intro como la tecla Tab en toda mi aplicación WPF, es decir, en todas partes de la aplicación cuando el usuario presiona Intro Quiero enfocar el siguiente control enfocable, excepto cuando el botón está enfocado. ¿Hay alguna manera de hacerlo en el ciclo de vida de la aplicación? ¿Alguien puede darme un ejemplo?
¡Muchas gracias!
Interpretar enter como pestaña WPF

+1

BabySmash por Scott Hanselman utiliza algún teclado anula – bendewey

Respuesta

35

Puede usar mi código EnterKeyTraversal attached property si lo desea. Añadir al contenedor de alto nivel en una ventana de WPF y todo dentro tratará a entrar como pestaña:

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

El problema que estoy enfrentando es que cuando el foco se enciende un botón, lo que quiero para ejecutar el comando y se mueven en el siguiente índice de pestañas. ¿Es posible hacerlo? –

0

woodyiii, hay una función en el UIElement llamada PredictFocus() que por su nombre conoce su función, entonces se puede compruebe si ese elemento está habilitado o no para mover el foco hacia él o no ...

3

Solucioné el problema de woodyiii agregando un FrameworkElement.Tag (cuyo valor es IgnoreEnterKeyTraversal) a ciertos elementos (botones, comboboxes, o cualquier cosa que quiera ignorar el recorrido de la tecla Intro) en mi XAML. Luego busqué esta etiqueta & en la propiedad adjunta. De este modo:

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

Asegúrese de hacer esto en el evento 'KeyDown' y no en' PreviewKeyDown' o el cursor no se moverá. Además, no especifica qué 'ue' es, pero al menos para mí tiene que ser' e.Source'. – Conrad

+1

Eso está bien. Funciona en TextBox si tiene Tag = "IgnoreEnterKeyTraversal" pero quiero lo mismo en ComboBox con IsEditable = "true". En ese escenario tu truco no funciona. ¿Puedes decirme cómo puedo hacer eso? – Vishal

4

para cambiarlo en todo el proyecto que tiene que hacer este

  • En 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)); 
        } 
    } 
    
  • compilar. Y lo hizo. Ahora puede usar enter como pestaña. Nota: Este trabajo para los elementos de la red

Cuestiones relacionadas