2011-05-31 99 views
3

我的TreeViewItem.Items数据模板包含2个文本框。当我在第一个文本框中按下Tab键时,焦点会进入第二个文本框。我想当我按下第二个文本框上的Tab - 将焦点放在下一个TreeViewItem子项目上的第一个文本框中,如果有TreeViewItem没有下一个子项目,则焦点将在下一个TreeViewItem的第一个子项目上进行。怎么做?WPF TreeView中的键盘导航

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

回答

6

自己有这个问题,我在网上看了这个,只看到了有关WPF商业自定义控件的论坛帖子。然而,因为它们依赖于WPF的通用容器的设计,他们仍然可以工作:

设置你的TreeView标签的KeyboardNavigation.TabNavigation属性Contained,包括您在树中的以下内容:

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

有三个问题这个。按住Shift键不起作用。 (请参阅此question。)此外,上下箭头键不会太多。我刚刚发现这样做会处理MouseLeftButtonUp事件,以便您自己的事件不会被触发。