2008-09-25 6 views
5

J'essaie d'obtenir l'équivalent d'un WinForms ListView avec sa propriété View définie sur View.List. Visuellement, ce qui suit fonctionne bien. Les noms de fichier dans mon Listbox vont de haut en bas, puis retournez dans une nouvelle colonne.ListBox + WrapPanel Navigation par touches fléchées

Voici le XAML de base, je travaille avec:

<ListBox Name="thelist" 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" 
       Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

Cependant, la touche de navigation par défaut flèche ne RVPD. Si le dernier élément d'une colonne est sélectionné, appuyer sur la flèche vers le bas ne va pas au premier élément de la colonne suivante.

J'ai essayé traiter l'événement KeyDown comme ceci:

private void thelist_KeyDown(object sender, KeyEventArgs e) { 
    if (object.ReferenceEquals(sender, thelist)) { 
     if (e.Key == Key.Down) { 
      e.Handled = true; 
      thelist.Items.MoveCurrentToNext(); 
     } 
     if (e.Key == Key.Up) { 
      e.Handled = true; 
      thelist.Items.MoveCurrentToPrevious(); 
     } 
    } 
} 

Ce produit le dernier en colonne pour la première en suivant colonne le comportement que je voulais, mais produit aussi une bizarrerie dans la gauche et manipulation de la flèche droite. À chaque fois qu'il passe d'une colonne à la suivante/précédente en utilisant les flèches haut/bas, une seule utilisation ultérieure de la touche fléchée gauche ou droite déplace la sélection vers la gauche ou la droite de l'élément sélectionné juste avant l'emballage.

Supposons que la liste est remplie avec les chaînes "0001" à "0100" avec 10 chaînes par colonne. Si j'utilise la touche fléchée vers le bas pour aller de "0010" à "0011", puis appuyer sur la touche fléchée droite, la sélection passe à "0020", juste à droite de "0010". Si "0011" est sélectionné et que j'utilise la touche fléchée vers le haut pour déplacer la sélection sur "0010", une pression sur les flèches droite déplace la sélection sur "0021" (à droite de "0011", et une pression sur la gauche flèche touche de sélection se déplace à « 0001 ».

Toute aide la réalisation de la mise en page de colonne wrap désirée et la flèche de navigation clé serait appréciée.

(Edits déplacé à ma propre réponse, car il est techniquement une réponse.)

Répondre

8

il se trouve que quand il enroule autour de ma gestion de l'événement KeyDown, les changements de sélection à l'élément correct, mais accent est mis sur l'ancien article.

Voici le gestionnaire d'événements KeyDown mis à jour. En raison de la liaison, la collection Items renvoie mes éléments réels plutôt que ListBoxItem s, donc je dois faire un appel vers la fin pour obtenir le ListBoxItem réel, je dois appeler Focus() sur. L'enroulement du dernier élément au premier et inversement peut être réalisé en échangeant les appels MoveCurrentToLast() et MoveCurrentToFirst().

private void thelist_KeyDown(object sender, KeyEventArgs e) { 
    if (object.ReferenceEquals(sender, thelist)) { 
     if (thelist.Items.Count > 0) { 
      switch (e.Key) { 
       case Key.Down: 
        if (!thelist.Items.MoveCurrentToNext()) { 
         thelist.Items.MoveCurrentToLast(); 
        } 
        break; 

       case Key.Up: 
        if (!thelist.Items.MoveCurrentToPrevious()) { 
         thelist.Items.MoveCurrentToFirst(); 
        } 
        break; 

       default: 
        return; 
      } 

      e.Handled = true; 
      ListBoxItem lbi = (ListBoxItem) thelist.ItemContainerGenerator.ContainerFromItem(thelist.SelectedItem); 
      lbi.Focus(); 
     } 
    } 
} 
+0

Très bien, cela m'a beaucoup aidé. ;) – Inferis

4

Vous devriez être en mesure de le faire sans l'écouteur d'événement à l'aide KeyboardNavigation.DirectionalNavigation, par exemple

<ListBox Name="thelist" 
     IsSynchronizedWithCurrentItem="True" 
     ItemsSource="{Binding}" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled" 
     KeyboardNavigation.DirectionalNavigation="Cycle"> 
Questions connexes