2009-05-16 10 views
19

Voglio interpretare il tasto Invio come tasto Tab in tutta la mia applicazione WPF, cioè ovunque nella mia applicazione quando l'utente preme Invio Voglio mettere a fuoco il prossimo controllo focalizzabile, tranne quando il pulsante è focalizzato. C'è un modo per farlo nel circolo di vita delle applicazioni? Qualcuno può darmi un esempio?
Grazie mille!
Interpreta immetti come scheda WPF

+1

BabySmash da Scott Hanselman utilizza alcuni tastiera sovrascrive – bendewey

risposta

35

È possibile utilizzare il mio codice EnterKeyTraversal attached property se lo si desidera. Aggiungerlo al contenitore di livello superiore su una finestra WPF e tutto all'interno tratterà entrare come scheda:

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

Il problema che sto affrontando è che quando il fuoco si accende un pulsante, voglio eseguire il comando e andare avanti il indice tab successivo. È possibile farlo?? –

0

woodyiii, c'è una funzione nella UIElement chiamato PredictFocus(), che con il suo nome conosce la sua funzione, allora si può controlla se quell'elemento è abilitato o meno in modo da spostare il focus su di esso o no ...

3

Ho risolto il problema di woodyiii aggiungendo un oggetto FrameworkElement.Tag (il cui valore è IgnoreEnterKeyTraversal) a determinati elementi (pulsanti, caselle combinate, o qualcosa che voglio ignorare l'attraversamento del tasto enter) nel mio XAML. Ho quindi cercato questo tag & nella proprietà allegata. In questo 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

Assicuratevi di farlo nell'evento 'KeyDown' e non in' PreviewKeyDown', altrimenti il ​​caret non si muoverà. Inoltre, non si specifica cosa 'ue' è, ma almeno per me deve essere' e.Source'. – Conrad

+1

Questo va bene. Funziona su TextBox se ha Tag = "IgnoreEnterKeyTraversal" ma voglio la stessa cosa su ComboBox con IsEditable = "true". In quello scenario il tuo trucco non funziona. Puoi dirmi come posso farlo ?? – Vishal

4

di cambiarlo in tutto il progetto è necessario fare questo

  • In 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)); 
        } 
    } 
    
  • Compile. E fatto. Ora puoi usare la scheda "inserisci come". Nota: Questo lavoro per gli elementi nella griglia

Problemi correlati