2010-02-08 12 views
9

Dopo aver selezionato la voce ListBox a livello di codice, è necessario premere il tasto \ su due volte per spostare la selezione. Eventuali suggerimenti?Impostazione della messa a fuoco su un oggetto ListBox interrompe la navigazione da tastiera

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> 

Codice:

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

risposta

12

Non impostare la messa a fuoco per la ListBox ... impostare la messa a fuoco per la ListBoxItem selezionato. Questo risolverà il problema "due colpi di tastiera richiesto":

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

Se il ListBox contiene qualcosa di diverso da ListBoxItem s, è possibile utilizzare per ottenere il lbActions.ItemContainerGenerator.ContainerFromIndex(lbActions.SelectedIndex) automaticamente generato ListBoxItem.


Se si vuole che questo accada durante finestra di inizializzazione, è necessario inserire il codice nell'evento Loaded piuttosto che nel costruttore. Esempio (XAML):

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

Codice (sull'esempio nella tua domanda):

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

Ho già selezionati voce in XAML "IsSelected =" true "fornisco ulteriore selezione nel codice, quindi potrebbe essere più evidente ciò che voglio fare." LbActions.SelectedIndex = 0; ". – StreamT

+0

La mia risposta funziona ancora, basta inserire il codice * dopo * the' SelectedIndex = 0'. – Heinzi

+0

Non funziona per me. Elemento selezionato, questo non è un problema.La navigazione della tastiera non funziona correttamente dopo. – StreamT

1

È possibile farlo facilmente in XAML troppo. Si noti che questo imposterà solo la messa a fuoco logica.

Ad esempio:

<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> 
Problemi correlati