Question

J'essaie d'obtenir l'équivalent d'un ListView WinForms avec sa propriété View définie sur View.List . Visuellement, ce qui suit fonctionne bien. Les noms de fichier de ma Listbox vont de haut en bas, puis se terminent à une nouvelle colonne.

Voici le XAML de base sur lequel je travaille:

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

Cependant, la navigation par défaut avec les touches fléchées ne se termine pas. Si le dernier élément d'une colonne est sélectionné, le fait d'appuyer sur la flèche vers le bas ne vous dirigera pas vers le premier élément de la colonne suivante.

J'ai essayé de gérer l'événement KeyDown comme suit:

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();
        }
    }
}

Ceci produit le comportement que je souhaitais du dernier dans la colonne au premier dans la colonne suivante, mais produit également une bizarrerie dans la gestion des flèches gauche et droite. Chaque fois qu'il passe d'une colonne à la suivante / à l'aide des flèches haut / bas, une seule utilisation ultérieure des touches fléchées gauche ou droite déplace la sélection vers la gauche ou la droite de l'élément sélectionné juste avant la modification.

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

Toute aide permettant d’obtenir la disposition d’enveloppe de colonne et la navigation par touches de direction souhaitée serait la bienvenue.

(Les modifications ont été déplacées dans ma propre réponse, puisqu'il s'agit techniquement d'une réponse.)

Était-ce utile?

La solution

Il s'avère que lorsque la gestion de l'événement KeyDown est terminée, la sélection passe à l'élément correct, mais l'accent est mis sur l'ancien élément.

Voici le gestionnaire d'événements mis à jour KeyDown . En raison de Binding, la collection Items renvoie mes éléments réels plutôt que ListBoxItem , je dois donc effectuer un appel proche de la fin pour obtenir le ListBoxItem Je dois appeler Focus () sur. Il est possible d’emballer le dernier élément au premier et vice-versa en échangeant les appels de MoveCurrentToLast () et de 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();
        }
    }
}

Autres conseils

Vous devriez pouvoir le faire sans l'écouteur d'événements utilisant KeyboardNavigation.DirectionalNavigation, par exemple.

<ListBox Name="thelist"
         IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding}"
         ScrollViewer.VerticalScrollBarVisibility="Disabled"
         KeyboardNavigation.DirectionalNavigation="Cycle">
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top