2010-10-08 17 views
2

J'ai wpf UserControl contenant un combobox et une zone de texte dans une rangée. Actuellement, le seul moyen de passer d'un composant à l'autre est d'intercaler entre eux, mais j'aimerais aussi pouvoir passer de la liste déroulante à la zone de texte en utilisant les touches fléchées gauche et droite.Puis-je naviguer dans et hors d'une zone de liste déroulante wpf en utilisant les touches fléchées au lieu de tabulation?

Il n'est pas aussi facile que gifler un eventhandler sur l'événement keyup.

void ComboKeyUp(object sender, KeyEventArgs e) 
{ 
    if(e.Key == Key.Right) 
    { 
     e.Handled = true; 
     textbox.Focus(); 
    } 
} 

... parce que le combo changera de valeur malgré le signalement de l'événement comme étant géré.

est-il un moyen de faire ce qui ne se brise pas en même temps le haut/bas sélection d'articles dans la zone de liste déroulante?

Répondre

1

Il se trouve qu'il ya une Gotcha, vous abonner à l'événement KeyDown à la place.

2

J'ai créé le combobox avec textboxes:

<ComboBox Width="100" Height="25" PreviewKeyDown="ComboboxPreviewKeyDown"> 
    <ComboBox.Items> 
    <TextBox Text="Item 1"/> 
    <TextBox Text="Item 2"/> 
    <TextBox Text="Item 3"/> 
    </ComboBox.Items> 
</ComboBox> 

gestionnaire Puis ajouté:

private void ComboboxPreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Action<FocusNavigationDirection> moveFocus = focusDirection => { 
      e.Handled = true; 
      var request = new TraversalRequest(focusDirection);   
      var focusedElement = Keyboard.FocusedElement as UIElement; 
      if (focusedElement != null) 
       focusedElement.MoveFocus(request); 
     }; 

     if (e.Key == Key.Down) 
      moveFocus(FocusNavigationDirection.Next); 
     else if (e.Key == Key.Up) 
      moveFocus(FocusNavigationDirection.Previous); 
    } 

maintenant les boutons "Up" et "Down" comportement sont les mêmes que "Tab" et « Shift + Tab »