2009-03-28 7 views
1

Je développe un programme dans WPF (VB) qui repose uniquement sur la navigation au clavier.Déplacer le focus du clavier loin de ListBox

Dans mon programme, j'ai une liste déroulante qui affiche jusqu'à 20000 éléments. Ce que je veux, c'est que lorsque la listbox a le focus sur le clavier et que je passe à l'élément visible (en utilisant ArrowDown), je veux que le focus passe à l'élément suivant en dehors de la liste. J'utilise PgUp et PgDown pour faire défiler le contenu de la liste, et la recherche de texte pour accéder aux éléments.

Y at-il un moyen de détecter si l'élément ciblé/sélectionné est le dernier/premier élément visible dans la liste?

Si oui, je pouvais utiliser:

ListBox1.MoveFocus(New TraversalRequest(FocusNavigationDirection.Down)) 

Répondre

2

Je suggère que vous ne le faites pas, l'interface utilisateur doit se comporter consitesntly avec d'autres interfaces utilisateur du système d'exploitation.

Vos utilisateurs feraient mieux de proposer une autre interface utilisateur cohérente avec le comportement des interfaces utilisateur sur votre système d'exploitation cible.

0

Il est un peu clair de votre explication, mais soit votre recherche:

  1. navigation pour se déplacer à l'extérieur de la zone de liste lorsque le dernier élément est sélectionné.
  2. lorsque la navigation est tentée au-delà du dernier élément de la liste que la navigation sort de la zone de liste.

Si (1 ) est votre objectif, il est probablement une solution raisonnable en utilisant des déclencheurs et ou une manipulation du code personnalisé pour des événements basés sur l'élément sélectionné et l'élément sélectionné a changé. Je serais d'accord avec Tom si c'est le cas et je suggère de ne pas l'implémenter de cette façon puisque le dernier élément ne sera jamais sélectionnable sans que le focus soit supprimé par programme. Si vous cherchez plutôt à le faire() alors il est de mon expérience que le comportement naturel d'un ListBox est de passer au contrôle suivant lorsque la touche Tab est enfoncé et j'ai testé cela pour la flèche vers le bas clé aussi bien et cela fonctionne de la même manière. Quand j'arrive au dernier élément de la liste, le focus sort de la liste et du contrôle suivant en fonction de son parent.

MISE À JOUR: Je dois retirer mes commentaires originaux que le comportement que je décrit ci-dessus ne décrivent pas le comportement par défaut dans WPF pour une ListBox mais il est le comportement que vous verrez le comportement que je décrit ci-dessus (que je crois le comportement que vous recherchez) lors de l'implémentation d'ItemsControl et de la spécification d'un ItemTemplate. Jetez un oeil à l'exemple suivant.

<ItemsControl ItemsSource="{Binding ElementName=TheWindow, Path=ListOStrings}"> 
    <ItemsControl.Template> 
     <ControlTemplate TargetType="{x:Type ItemsControl}"> 
      <Border BorderBrush="Magenta" 
        BorderThickness="1"> 
       <ScrollViewer> 
        <ItemsPresenter /> 
       </ScrollViewer> 
      </Border> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Par chance, cela arrive juste pour avoir le comportement que vous avez décrit, puisque chaque élément de la liste se comporte presque comme un contrôle placé directement en tant que pair à tous les autres contrôles.

0

-je utiliser un truc facile à déplacer le focus en dehors Listbox: -je désactiver la zone de liste si le focus se déplace automatiquement à la commande suivante, puis-je activer la zone de liste à nouveau :)

Lst.IsEnabled = False 
Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next)) 
Lst.IsEnabled = True 
Questions connexes