Why doesn't tab order between / inside TreeView work?

I have a window with the following xaml:

<Window x:Class="TestDemoApp.TreeViewWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TreeViewWindow" Height="300" Width="300"> <Window.Resources> <Style TargetType="Control" x:Key="FocusedStyle"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle StrokeThickness="1" Stroke="Red" StrokeDashArray="1 2 3 4" SnapsToDevicePixels="true"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style TargetType="TreeViewItem"> <Setter Property="IsTabStop" Value="True"/> <Setter Property="Focusable" Value="True"/> <Setter Property="FocusVisualStyle" Value="{StaticResource FocusedStyle}"/> <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/> </Style> <Style TargetType="ListViewItem"> <Setter Property="IsTabStop" Value="True"/> <Setter Property="Focusable" Value="True"/> <Setter Property="FocusVisualStyle" Value="{StaticResource FocusedStyle}"/> <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/> </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <ListView TabIndex="1" BorderThickness="5" Focusable="True" IsTabStop="True" KeyboardNavigation.TabNavigation="Continue" FocusVisualStyle="{StaticResource FocusedStyle}"> <ListViewItem TabIndex="2" Content="List Item 1"/> <ListViewItem TabIndex="3" Content="List Item 2"/> </ListView> <TreeView TabIndex="6" BorderThickness="5" Focusable="True" IsTabStop="True" KeyboardNavigation.TabNavigation="Continue" Grid.Row="1" FocusVisualStyle="{StaticResource FocusedStyle}"> <TreeView.Items> <TreeViewItem TabIndex="7" Header="Tree Item 1"> <TreeViewItem Header="Tree Item 11"></TreeViewItem> <TreeViewItem Header="Tree Item 12"/> </TreeViewItem> <TreeViewItem Header="Tree Item 2"> </TreeViewItem> </TreeView.Items> </TreeView> </Grid> </Window> 

When I run the program, the tab order:

  1. List View
 2. List Item 1
 3. List Item 2
 4. Tree View
 5. Tree Item 1
 6. Tree Item 2

 7. List View (# 1)
 8. List Item 1 (# 2)
 9. List Item 2 (# 3)
 10. Tree Item 2 (6 #)

 11+ Repeat # 7 - # 10

The expected behavior is that it repeats C # 1 through # 6 during further iterations, however, instead it skips # 4 and # 5 for any subsequent iterations.

Why is this? And how can I fix this?

+6
source share
1 answer

Wow, this is UGLY. The WPF tree view is my favorite target for this adjective in many ways, but I have not encountered this particular problem before.

I donโ€™t think you can do better than Continue for KeyboardNavigation.TabNavigation , the only option is Local , and this also does not work. See this msdn article . In addition, combinations like Cycle for elements and Continue on the control did not give the desired result for me.

It is quite obvious that the selected item is saved in the tree view when the focus returns to the list, and the next time the tree receives focus, it goes directly to the previously selected item (tree item 2), unlike listview, which retains the selection, but correctly focuses the control first, and then the elements.

So a quick and dirty hack that might work for you is to remove the selection from the tree when it loses focus. Unfortunately, the event fires every time the selected item changes, but the hack still works.

 <TreeView (...) LostFocus="TreeView_LostFocus"> 

code behind:

 private void TreeView_LostFocus(object sender, RoutedEventArgs e) { TreeView tv = (TreeView)sender; TreeViewItem item = tv.SelectedItem as TreeViewItem; if (item != null) item.IsSelected = false; } 
+3
source

Source: https://habr.com/ru/post/944508/


All Articles