2011-09-18 2 views
17

Ok Ho un ListView che ha 2 GridViewColumns uno che visualizza un numero e uno contenente un TextBox Il mio problema è che voglio essere in grado di passare attraverso tutti i TextBox che ho in GridViewColumn. Con la proprietà KeyboardNavigation.TabNavigation associata ottengo quasi ciò che voglio.
Quello che raggiungere è:
primo TAB - tutto il primo ListViewItem focalizzata
secondo TAB - primo TextBox focalizzata
terza scheda - tutto il secondo ListViewItem focalizzata
quarta scheda - secondo TextBox focalizzata
Come TAB tramite TextBoxes in un controllo ListView

Quello che voglio è
primo TAB - primo TextBox focalizzata
secondo TAB - seconda TextBox focalizzata

<ListView KeyboardNavigation.TabNavigation="Continue" Name="TheLabelListView" > 
          <ListView.ItemContainerStyle > 
            <EventSetter Event="Selected" Handler="ItemSelected" /></Style> 
          </ListView.ItemContainerStyle> 
          <ListView.View> 
           <GridView x:Name="GridViewSmall" > 
            <GridViewColumn Header="#" Width="20" DisplayMemberBinding="{Binding SelectorIndexNumber}" /> 
            <GridViewColumn Header="Selector" Width="175"> 
             <GridViewColumn.CellTemplate> 
              <DataTemplate> 
               <TextBox Name="SelectorTextBox" Text="{Binding SelectorName}" />              
              </DataTemplate> 
             </GridViewColumn.CellTemplate> 
            </GridViewColumn> 
           </GridView> 
          </ListView.View> 
         </ListView> 

Questo codice mi è stato dato da H.B. . Dovrebbe essere eseguito quando ListViewÍtem è selezionato e trova il TextBox e lo mette a fuoco. In qualche modo continua a non selezionare il TextBox ogni volta anche se questo metodo viene eseguito bool TextBoxgotFocus è sempre true.

private void ItemSelected(object sender, RoutedEventArgs e) 
    { 
     var item = sender as ListViewItem; 
     TextBox h = (FindNamedChild(item, "SelectorTextBox") as TextBox); 
     bool TextBoxgotFocus = h.Focus(); 
    } 

    public static object FindNamedChild(DependencyObject container, string name) 
    { 
     if (container is FrameworkElement) 
     { 
      if ((container as FrameworkElement).Name == name) return container; 
     } 
     var ccount = VisualTreeHelper.GetChildrenCount(container); 
     for (int i = 0; i < ccount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(container, i); 
      var target = FindNamedChild(child, name); 
      if (target != null) 
      { 
       return target; 
      } 
     } 
     return null; 
    } 

risposta

27

Il problema è che per ogni elemento nella visualizzazione elenco, si hanno due punti di tabulazione: l'oggetto stesso e la casella di testo. Si desidera impostare KeyboardNavigation.IsTabStop su false per gli elementi stessi. Basta impostarlo nello stile del tuo articolo.

<ListView KeyboardNavigation.TabNavigation="Continue" Name="TheLabelListView"> 
    <ListView.ItemContainerStyle> 
     <Style> 
      <Setter Property="KeyboardNavigation.IsTabStop" Value="False" /> 
     </Style> 
    </ListView.ItemContainerStyle> 

    <!-- etc... --> 
</ListView> 
+0

Grazie. Questo è esattamente –

+0

Recentemente ho affrontato esattamente lo stesso problema. Ma la tua risposta non ha aiutato. Ho scoperto che gli oggetti listView senza caselle di testo (senza tabStops in essi) schiaccia tutta la navigazione della scheda listView. In altre parole, eveything è ok solo quando ogni voce di elenco ha almeno un tabstop all'interno e in tal caso - sì - non è necessario impostare nessun tabstop per il contenitore di oggetti per farlo bene. ma cosa succede se alcuni oggetti agiscono come intestazioni? per favore aiuto. – mjollneer