Клавиатурная навигация в WPF TreeView - PullRequest
3 голосов
/ 31 мая 2011

Мой шаблон данных TreeViewItem.Items содержит 2 текстовых поля. Когда я нажимаю клавишу Tab в первом текстовом поле, фокус переходит на второе текстовое поле. Я хочу, чтобы, когда я нажимаю клавишу Tab во втором текстовом поле, фокусируемся на первом текстовом поле на следующем подэлементе TreeViewItem, и если TreeViewItem не имеет следующего подэлемента, фокус переходит на первый подэлемент на следующем TreeViewItem. Как это сделать?

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

1 Ответ

7 голосов
/ 28 ноября 2011

Имея эту проблему сам, я искал это в Интернете и видел только сообщения на форуме о коммерческих пользовательских элементах управления для WPF.Однако, поскольку они опираются на общий дизайн контейнера WPF, они все еще работают:

Установите для свойства KeyboardNavigation.TabNavigation вашего тега TreeView значение Contained и включите в свое дерево следующее:

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

Есть три проблемы с этим.Shift-tab просто не работает.(См. Этот вопрос .) Кроме того, клавиши со стрелками вверх и вниз мало что делают.И я только что обнаружил, что при этом будет обрабатываться событие MouseLeftButtonUp, поэтому ваше собственное событие не будет запущено.

...