wpf treeview tabs navigation

Navegación por el teclado en WPF TreeView



tabs navigation (1)

Mi plantilla de datos TreeViewItem.Items contiene 2 cuadros de texto. Cuando presiono la tecla Tab en el primer cuadro de texto, el foco se enfoca en el segundo cuadro de texto. Quiero cuando presiono la tecla Tab en el segundo cuadro de texto - foco va al primer cuadro de texto en el siguiente subelemento TreeViewItem y si TreeViewItem no tiene el siguiente subelemento, el foco va al primer subelemento en el siguiente TreeViewItem. ¿Como hacer eso?

<TreeView Name="resultsTv" ItemTemplate="{StaticResource excerciseResultDataTemplate}" KeyboardNavigation.TabNavigation="Contained"> <TreeView.ItemContainerStyle> <Style> <Setter Property="TreeViewItem.IsExpanded" Value="True"/> <Setter Property="KeyboardNavigation.TabNavigation" Value="Contained"></Setter> </Style> </TreeView.ItemContainerStyle> </TreeView> <HierarchicalDataTemplate x:Key="excerciseResultDataTemplate" ItemTemplate="{StaticResource setDataTemplate}" ItemsSource="{Binding Sets}"> <StackPanel Orientation="Horizontal" KeyboardNavigation.TabNavigation="Continue"> <Label Content="{Binding Name}"></Label> </StackPanel> </HierarchicalDataTemplate> <DataTemplate x:Key="setDataTemplate"> <StackPanel Orientation="Horizontal" KeyboardNavigation.TabNavigation="Continue"> <TextBox Width="50" Text="{Binding Weight}"/> <TextBox Width="50" Text="{Binding Repeats"/> </StackPanel> </DataTemplate>


Al tener este problema yo mismo lo busqué en Internet y solo vi publicaciones en el foro sobre controles comerciales personalizados para WPF. Sin embargo, dado que dependen del diseño de contenedor genérico de WPF, aún funcionan:

Establezca la propiedad KeyboardNavigation.TabNavigation de su etiqueta TreeView en Contained e incluya lo siguiente en su árbol:

<TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/> </Style> </TreeView.ItemContainerStyle>

Hay tres problemas con esto. Shift-tab simplemente no funciona. (Consulte esta pregunta .) Además, las teclas de flecha arriba y abajo no hacen mucho. Y acabo de descubrir que al hacer esto manejaré el evento MouseLeftButtonUp para que su propio evento no se desencadene.