2008-09-25 20 views
5

Estoy tratando de lograr el equivalente de un WinForms ListView con su propiedad View establecido en View.List. Visualmente, lo siguiente funciona bien. Los nombres de archivo en mi Listbox van de arriba a abajo y luego se envuelven en una nueva columna.ListBox + WrapPanel tecla flecha de navegación

Aquí está el XAML básica estoy trabajando con:

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

Sin embargo, por defecto flecha tecla de navegación no significa envolver. Si se selecciona el último elemento en una columna, presionar la flecha hacia abajo no va al primer elemento de la siguiente columna.

he intentado controlar el evento KeyDown así:

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

Esto produce el último en entrar, la columna a la primera en su última columna de comportamiento que yo quería, pero también produce una rareza en la izquierda y manejo de la flecha derecha. Cada vez que se ajusta de una columna a la siguiente/anterior con las flechas arriba/abajo, un solo uso posterior de la tecla de flecha izquierda o derecha mueve la selección a la izquierda o a la derecha del elemento que se seleccionó justo antes de que se produzca el ajuste.

Supongamos que la lista está llena de cadenas "0001" a "0100" con 10 cadenas por columna. Si utilizo la tecla de flecha hacia abajo para ir de "0010" a "0011", luego presiono la tecla de la flecha hacia la derecha, la selección se mueve a "0020", justo a la derecha de "0010". Si se selecciona "0011" y utilizo la tecla de flecha hacia arriba para mover la selección a "0010", al presionar las teclas de flecha hacia la derecha se mueve la selección a "0021" (a la derecha de "0011", y una presión hacia la izquierda flecha de selección tecla mueve a "0001".

Cualquier ayuda lograr el diseño de columna-wrap deseado y flecha tecla de navegación sería apreciada.

(ediciones se trasladó a mi propia respuesta, ya que técnicamente es una respuesta.)

Respuesta

8

resulta que cuando se envuelve alrededor de mi manejo de los KeyDown de eventos, cambios de selección para el artículo correcto, pero se centra en el tema de edad.

Aquí está el controlador de eventos KeyDown actualizado. Debido a la vinculación, la colección Items devuelve mis elementos reales en lugar de ListBoxItem s, así que tengo que hacer una llamada cerca del final para obtener el ListBoxItem en el que necesito llamar al Focus(). El ajuste de la última posición a la primera y viceversa se puede lograr intercambiando las llamadas de MoveCurrentToLast() y 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

Genial, esto me ayudó mucho. ;) – Inferis

4

Usted debe ser capaz de hacerlo sin el detector de eventos utilizando KeyboardNavigation.DirectionalNavigation, por ejemplo,

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