WPF - управление навигацией с помощью клавиатуры в TreeView - PullRequest
1 голос
/ 31 июля 2011

У меня проблема с клавиатурной навигацией в моем дереве.Я реализую таблицу из 3 столбцов.Каждый элемент в первом столбце состоит из 3 столбцов: значок, текстовый блок и расширитель.Если свойство элемента "hasItems" имеет значение false, расширитель скрыт.Моя проблема в том, что я не могу использовать стрелки вверх и вниз для перемещения вверх и вниз по дереву.Я попытался установить для свойства экспандера 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> 

Спасибо, Ли

...