.net WPF-控制TreeView中的键盘导航

.net WPF-控制TreeView中的键盘导航,.net,wpf,treeview,keyboard-navigation,.net,Wpf,Treeview,Keyboard Navigation,我的树视图中的键盘导航有问题。 我正在实现一个3列表。第一列中的每个元素由3列组成: 图标、文本块和扩展器。如果元素的属性hasItems为false,则会隐藏扩展器。我的问题是我不能使用上下箭头在树上上下导航。我已尝试将expander IsTabStop属性设置为true,但这并没有提供所需的结果。 这感觉就像扩展器获得了焦点:上下箭头仅在我卸下扩展器时获得扩展器上下的焦点导航按预期操作 这是某种伪代码,只是为了解释我的雇佣关系: <ScrollViewer >

我的树视图中的键盘导航有问题。 我正在实现一个3列表。第一列中的每个元素由3列组成: 图标、文本块和扩展器。如果元素的属性hasItems为false,则会隐藏扩展器。我的问题是我不能使用上下箭头在树上上下导航。我已尝试将expander IsTabStop属性设置为true,但这并没有提供所需的结果。 这感觉就像扩展器获得了焦点:上下箭头仅在我卸下扩展器时获得扩展器上下的焦点导航按预期操作

这是某种伪代码,只是为了解释我的雇佣关系:

<ScrollViewer >

        <TreeView ItemsSource="{Binding TreeRootInstance}">
        <TreeView.Resources>

            <DataTemplate x:Key="CellTemplate">
                    <Border >
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition />
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>

                            <Image  Grid.Column="0"/>

                            <TextBlock Text="{Binding Name}" Grid.Column="1"  />
                            <ToggleButton x:Name="Expander"
                                      Grid.Column="2"
                                      IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}"
                                      ClickMode="Press"/>
                        </Grid>
                    </Border>

                    <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=HasItems, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Value="False">
                        <Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>


                <GridViewColumnCollection x:Key="gvcc">
                    <GridViewColumn  CellTemplate="{StaticResource CellTemplate}" >
                        <GridViewColumn.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock   Text="First Column" />
                            </DataTemplate>
                        </GridViewColumn.HeaderTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock   Text="Second Column" />
                            </DataTemplate>
                        </GridViewColumn.HeaderTemplate>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn >
                        <GridViewColumn.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock Text="Third Column"/>
                            </DataTemplate>
                        </GridViewColumn.HeaderTemplate>

                    </GridViewColumn>
                </GridViewColumnCollection>



<Style TargetType="{x:Type TreeView}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TreeView}">
                            <Border BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}">
                                <DockPanel>
                                    <GridViewHeaderRowPresenter Columns="{StaticResource gvcc}"
                                                                ColumnHeaderContainerStyle="{StaticResource TreeHeaderStyle}"
                                                                Margin="0"
                                                                DockPanel.Dock="Top"/>
                                    <ItemsPresenter/>
                                </DockPanel>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style> 
谢谢,
Li

很难说您是如何使用GridViewColumnCollection的,您是在TreeView的ItemTemplate中使用ListView吗?在这种情况下,感觉ListViewItems获得了焦点。在正确的位置设置Focusable=False应该可以解决这个问题,例如在ItemContainerStyleforListViewItem,但是正如我所说的,很难感谢您的回复。这是一种遗留代码,我是WPF的新手,所以我仍在试图弄清楚那里发生了什么。。。但是你能告诉我为什么将扩展器的聚焦设置为false不起作用吗?然后我可以通过捕获其他事件手动扩展扩展器…请注意GridViewColumnCollection的第一列使用了前面在代码中定义的cellTemplate是的,我注意到了。我试着在这里重现你的问题,但有点难,因为我不确定它的其余部分是什么样子。您是否在某处使用ListView?非常感谢您的帮助。。。正如我所说,我是WPF的新手,在那里我感到很失落。。。这不是最容易调试的事情,是吗?。无论如何,我正在考虑将扩展器的焦点设置为false,然后捕获一些事件,可能是KeyDown或其他什么,然后如果键是Enter,则手动扩展或折叠扩展器。。。你认为它能起作用吗?