2010-02-08 15 views
9

Después de seleccionar el elemento ListBox mediante programación, es necesario presionar la tecla arriba \ up dos veces para mover la selección. ¿Alguna sugerencia?Establecer el foco en un item ListBox rompe la navegación del teclado

Vista:

<ListBox Name="lbActions" Canvas.Left="10" Canvas.Top="10" 
       Width="260" Height="180"> 
     <ListBoxItem Name="Open" IsSelected="true" Content="Open"></ListBoxItem> 
     <ListBoxItem Name="Enter" Content="Enter"></ListBoxItem> 
     <ListBoxItem Name="Print" Content="Print"></ListBoxItem> 
</ListBox> 

Código:

public View() 
{ 
    lbActions.Focus(); 
    lbActions.SelectedIndex = 0; //not helps 
    ((ListBoxItem) lbActions.SelectedItem).Focus(); //not helps either 
} 

Respuesta

12

No establezca el foco al cuadro de lista ... ajustar el foco a la ListBoxItem seleccionado. Esto va a resolver el problema "dos golpes de teclado requerido":

if (lbActions.SelectedItem != null) 
    ((ListBoxItem)lbActions.SelectedItem).Focus(); 
else 
    lbActions.Focus(); 

Si el cuadro de lista contiene algo más que ListBoxItem s, se puede utilizar para obtener el lbActions.ItemContainerGenerator.ContainerFromIndex(lbActions.SelectedIndex) generada automáticamente ListBoxItem.


Si desea que esto ocurra durante la inicialización ventana, es necesario poner el código en el evento Loaded en lugar de en el constructor. Ejemplo (XAML):

<Window ... Loaded="Window_Loaded"> 
    ... 
</Window> 

Código (basado en el ejemplo de la pregunta):

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     lbActions.Focus(); 
     lbActions.SelectedIndex = 0; 
     ((ListBoxItem)lbActions.SelectedItem).Focus(); 
    } 
+0

que ya han seleccionado elemento en XAML "IsSelected =" true "proporciono selección adicional en el código, por lo que puede ser más evidente lo que quiero hacer." LbActions.SelectedIndex = 0; ". – StreamT

+0

Mi respuesta todavía funciona, simplemente ponga el código * después de * el' SelectedIndex = 0'. – Heinzi

+0

No funciona para mí. Artículo seleccionado, esto no es un problema. La navegación del teclado no funciona correctamente después. – StreamT

1

Usted puede hacer esto fácilmente en XAML también. Tenga en cuenta que esto establecerá solo el enfoque lógico.

Por ejemplo:

<Grid FocusManager.FocusedElement="{Binding ElementName=itemlist, Path=SelectedItem}"> 
    <ListBox x:Name="itemlist" SelectedIndex="1"> 
     <ListBox.Items> 
      <ListBoxItem>One</ListBoxItem> 
      <ListBoxItem>Two</ListBoxItem> 
      <ListBoxItem>Three</ListBoxItem> 
      <ListBoxItem>Four</ListBoxItem> 
      <ListBoxItem>Five</ListBoxItem> 
      <ListBoxItem>Six</ListBoxItem> 
     </ListBox.Items> 
    </ListBox> 
</Grid> 
Cuestiones relacionadas