Frage

Ich versuche, das Äquivalent eines WinForms ListView mit seiner View Eigenschaft zu erreichen, auf View.List. Optisch wirkt die folgende Ordnung. Die Dateinamen in meinem Listbox von oben nach unten gehen, und dann in eine neue Spalte wickeln.

Hier ist der Grund XAML Ich arbeite mit:

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

Allerdings Standardpfeil Navigation wickelt nicht. Wenn das letzte Element in einer Spalte ausgewählt wird, den Pfeil nach unten drücken geht nicht auf das erste Element der nächsten Spalte.

Ich habe versucht, die KeyDown Veranstaltung wie diese Handhabung:

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

Dies erzeugt die letzte-in-Spalte zur First-in-next-Spalte Verhalten, das ich wollte, sondern produziert auch eine Kuriosität in der linken und rechten Pfeil Handhabung. Jedes Mal, es von einer Spalte Wraps zum nächsten / vorherigen mit den Auf- / Ab-Pfeiltasten, eine einzelne spätere Verwendung des linken oder rechten Pfeiltaste bewegt die Auswahl nach links oder rechts des Elements, das gerade ausgewählt wurde, bevor der Wickel aufgetreten.

Nehmen wir die Liste mit Strings „0001“ bis „0100“ mit 10 Saiten pro Säule gefüllt ist. Wenn ich die Pfeiltaste nach unten verwenden, um von „0010“ bis „0011“ zu gehen, dann die rechte Pfeiltaste drückt, wird die Auswahl zu „0020“, nur rechts von „0010“. Wenn „0011“ ausgewählt ist, und ich verwende die Pfeiltaste bis zu Auswahl, um „0010“, dann ein Drücken der Pfeiltasten nach rechts bewegt die Auswahl auf „0021“ (rechts von „0011“, und ein Drücken der linken Pfeil bewegt Auswahl auf "0001".

Jede Hilfe würde geschätzt werden, um das gewünschte Spalte-wrap-Layout und Pfeil Navigation zu erreichen.

(Edits bewegte meine eigene Antwort, da es technisch eine Antwort.)

War es hilfreich?

Lösung

Es stellt sich heraus, dass, wenn es umschlingt in meinem Umgang mit der KeyDown Ereignis, Auswahl Änderungen an den richtigen Punkt, aber Schwerpunkt liegt auf dem alten Artikel.

Hier ist der aktualisierte KeyDown Eventhandler. Aufgrund der Bindung, gibt die Items Sammlung meiner eigentlichen Artikel anstatt ListBoxItems, so habe ich einen Anruf am Ende tun, um die tatsächlichen ListBoxItem ich Focus() anrufen müssen auszukommen. Einwickeln von den letzten Punkt zum ersten und umgekehrt kann durch Vertauschen der Anrufe von MoveCurrentToLast() und MoveCurrentToFirst() erreicht werden.

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

Andere Tipps

Es soll möglich sein, ohne den Ereignis-Listener zu tun mit KeyboardNavigation.DirectionalNavigation, z.

<ListBox Name="thelist"
         IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding}"
         ScrollViewer.VerticalScrollBarVisibility="Disabled"
         KeyboardNavigation.DirectionalNavigation="Cycle">
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top