2008-09-25 14 views
5

Ich versuche, das Äquivalent eines WinForms ListView mit seiner View Eigenschaft auf View.List festgelegt zu erreichen. Visuell funktioniert das Folgende gut. Die Dateinamen in meinem Listbox gehen von oben nach unten und dann zu einer neuen Spalte umbrechen.ListBox + WrapPanel Pfeilschlüssel Navigation

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> 

jedoch Standard-Pfeiltaste Navigation wickeln nicht. Wenn das letzte Element in einer Spalte ausgewählt ist, wird durch Drücken auf den Abwärtspfeil nicht zum ersten Element der nächsten Spalte gesprungen.

Ich habe versucht, Umgang mit dem KeyDown Ereignis wie folgt aus:

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, aber auch eine Kuriosität in der linken produziert und rechte Pfeilbehandlung. Jedes Mal, wenn es mit den Aufwärts-/Abwärtspfeilen von einer Spalte zur nächsten/vorherigen springt, verschiebt eine einzelne nachfolgende Verwendung der linken oder rechten Pfeiltaste die Auswahl nach links oder rechts von dem Element, das kurz vor dem Umbrechen ausgewählt wurde.

Angenommen, die Liste wird mit Strings "0001" bis "0100" mit 10 Strings pro Spalte gefüllt. Wenn ich die Abwärtspfeiltaste verwende, um von "0010" zu "0011" zu wechseln, dann drücke die rechte Pfeiltaste, die Auswahl wechselt zu "0020", genau rechts von "0010". Wenn "0011" ausgewählt ist und ich die Auswahltaste mit der Pfeil-nach-oben-Taste auf "0010" verschiebe, wird durch Drücken der rechten Pfeiltaste die Auswahl auf "0021" (rechts von "0011") und ein Linksdruck gesetzt Pfeil bewegt Auswahl auf „0001“.

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

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

Antwort

8

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

Hier ist der aktualisierte KeyDown Eventhandler. Wegen der Bindung, die Items Sammlung gibt meine tatsächlichen Artikel zurück, anstatt ListBoxItem s, so muss ich einen Anruf nahe dem Ende, um die tatsächliche ListBoxItem Ich brauche, um Focus() auf rufen. Das Umbrechen vom letzten Element zum ersten und umgekehrt kann erreicht werden, indem die Aufrufe von MoveCurrentToLast() und MoveCurrentToFirst() getauscht 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(); 
     } 
    } 
} 
+0

Großartig, das hat mir sehr geholfen. ;) – Inferis

4

Sie sollten es ohne den Event-Listener mit KeyboardNavigation.DirectionalNavigation, z.

Verwandte Themen