2011-08-11 15 views
6

Así que, básicamente, tienen este ListView y me gustaría que presionar Tab y recorrer mis TreeViewItems (preferiblemente sólo mis cuadros de texto)¿Cómo TAB a través de ListView con TextBoxes como TreeViewItems?

<ListView> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="number" /> 
      <GridViewColumn Header="Selector"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding SelectorName}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

El escenario que estoy viendo es después de pulsar la pestaña por primera vez la totalidad se selecciona TreeViewItem primero y al presionar Tab nuevamente se selecciona el primer TextBox. Finalmente, la tercera TAB sale del TreeView al siguiente control aunque hay más TextBoxes que me gustaría capturar antes de "tabular" al siguiente control. Thankx

Editar: La pregunta fue respondida aquí: How to TAB through TextBoxes in a ListView

Respuesta

2

Tal vez me falta algo, pero no puedo encontrar ningún método simple de hacer esto, aquí sería un esbozo de lo que podría hacer:

<ListView.InputBindings> 
    <KeyBinding Key="Tab" Command="{Binding GoToNextItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> 
    <KeyBinding Modifiers="Shift" Key="Tab" Command="{Binding GoToPreviousItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> 
</ListView.InputBindings> 
<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <EventSetter Event="Selected" Handler="ItemSelected" /> 
    </Style> 
</ListView.ItemContainerStyle> 
<ListView.View> 
    <GridView> 
     <GridViewColumn Header="number" /> 
     <GridViewColumn Header="Selector"> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <TextBox Name="_tb" Text="{Binding SelectorName}"/> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
</ListView.View> 

cosas que hizo aquí:

  • pestaña anular el comportamiento al fuego de los comandos para seleccionar otro elemento
  • Agregar controlador de eventos al evento seleccionado para enfocar el cuadro de texto
  • Nombre cuadro de texto para que pueda ser encontrado y se centró

Código:

private readonly ICommand _GoToNextItem = new Command((p) => 
    { 
     var lv = p as ListView; 
     if (lv.SelectedIndex == -1 || lv.SelectedIndex == lv.Items.Count - 1) 
     { 
      lv.SelectedIndex = 0; 
     } 
     else 
     { 
      lv.SelectedIndex++; 
     } 
    }); 
public ICommand GoToNextItem { get { return _GoToNextItem; } } 

private readonly ICommand _GoToPreviousItem = new Command((p) => 
{ 
    var lv = p as ListView; 
    if (lv.SelectedIndex <= 0) 
    { 
     lv.SelectedIndex = lv.Items.Count - 1; 
    } 
    else 
    { 
     lv.SelectedIndex--; 
    } 
}); 
public ICommand GoToPreviousItem { get { return _GoToPreviousItem; } } 
private void ItemSelected(object sender, RoutedEventArgs e) 
{ 
    var item = sender as ListBoxItem; 
    (FindNamedChild(item, "_tb") as TextBox).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; 
} 

Esto es muy incompleta, utilice ninguna parte de esto bajo su propio riesgo. (el enfoque también se podría haber hecho de otra manera sin traer la selección en este creo)

(La clase Command es sólo una aplicación genérica de ICommand que tiene una lambda que se ejecuta en Execute método de la interfaz)

+0

Gracias H.B. en realidad terminé sin usarlo, ya que era molesto cuando tenías muchos cuadros de texto que no saldrías del ListView aunque quisieras. Y no tenía idea de que SHIFT + TAB puede seleccionar TreeviewItem nuevamente y luego puede iterar con las flechas hacia arriba y hacia abajo, y aún tiene la opción de presionar la tecla Tab para salir de TreeView hacia el siguiente control. –

+0

@Mohamed Cheri: Sí, ser atrapado con pestañas no es muy conveniente. Espero que esto todavía sea de algunos para ti. –

0

Conjunto IsTabStop = "false" en el GridViewColumn y en la plantilla de la célula. Ahora debería seleccionar solo el TextBox dentro de la Plantilla de datos al cambiar de pestaña.

Prueba esto:

<ListView DataContext="List" IsTabStop="False" > 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" /> 
       <GridViewColumn Header="Selector"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate > 
          <TextBox Text="{Binding Name}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
+0

no es válida XAML. ¿lo dijiste? –

+0

Esto no funciona, las columnas no son compatibles con dicha propiedad y el foco aún deja todo el control en lugar de pasar al siguiente elemento. –

Cuestiones relacionadas