2013-07-12 9 views

risposta

5

È possibile gestire i/KeyUp eventi KeyDown sulle vostre caselle di testo (a seconda se si vuole andare a quello successivo all'inizio o alla fine della pressione di un tasto).

Esempio XAML:

<TextBox KeyUp="TextBox_KeyUp" /> 

Codice Dietro:

private void TextBox_KeyUp(object sender, KeyRoutedEventArgs e) 
    { 
     TextBox tbSender = (TextBox)sender; 

     if (e.Key == Windows.System.VirtualKey.Enter) 
     { 
      // Get the next TextBox and focus it. 

      DependencyObject nextSibling = GetNextSiblingInVisualTree(tbSender); 
      if (nextSibling is Control) 
      { 
       // Transfer "keyboard" focus to the target element. 
       ((Control)nextSibling).Focus(FocusState.Keyboard); 
      } 
     } 
    } 

codice di esempio completo compreso il codice per il metodo di supporto GetNextSiblingInVisualTree(): https://github.com/finnigantime/Samples/tree/master/examples/Win8Xaml/TextBox_EnterMovesFocusToNextControl

Nota che la chiamata di messa a fuoco() con FocusState.Keyboard mostra il punto di riferimento tratteggiato attorno agli elementi che hanno un retto nel loro modello di controllo (es. g. Pulsante). Chiamare Focus() con FocusState.Pointer non mostra il focus di messa a fuoco (si sta usando il touch/mouse, in modo da sapere con quale elemento si sta interagendo).

+0

Grazie Patrick. Funziona a meraviglia. – Sun

1

Ho apportato un leggero miglioramento alla funzione "GetNextSiblingInVisualTree". Questa versione cerca il successivo TextBox invece del prossimo oggetto.

private static DependencyObject GetNextSiblingInVisualTree(DependencyObject origin) 
    { 
     DependencyObject parent = VisualTreeHelper.GetParent(origin); 

     if (parent != null) 
     { 
      int childIndex = -1; 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i) 
      { 
       if (origin == VisualTreeHelper.GetChild(parent, i)) 
       { 
        childIndex = i; 
        break; 
       } 
      } 

      for (int nextIndex = childIndex + 1; nextIndex < VisualTreeHelper.GetChildrenCount(parent); nextIndex++) 
      { 
       DependencyObject currentObject = VisualTreeHelper.GetChild(parent, nextIndex); 

       if(currentObject.GetType() == typeof(TextBox)) 
       { 
        return currentObject; 
       } 
      } 
     } 

     return null; 
    }