Shift + Tab не работает в элементе управления TreeView - PullRequest
4 голосов
/ 27 мая 2010

Я не могу получить обратную навигацию с помощью Shift + Tab для работы в TreeView, который содержит TextBoxs, прямая навигация с помощью Tab работает нормально и переходить от TextBox к TextBox внутри TreeView. В любое время Shift + Tab используется, когда один из TextBox внутри TreeView, тогда фокус перемещается на предыдущий элемент управления вне TreeView, вместо предыдущего элемента управления внутри TreeView.

Также его единственная навигация Shift + Tab, которая работает неправильно, Ctrl + Shift + Tab работает, как ожидалось и в правильном порядке.

Есть предложения, что я делаю не так?

Пример кода:

<Window x:Class="TestTabTreeView.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Window.Resources>
    <Style TargetType="TreeViewItem">
        <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" />
    </Style>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBox Text="First Line" Grid.Row="0" />

    <TreeView Grid.Row="1" KeyboardNavigation.TabNavigation="Continue" IsTabStop="False">           
        <TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBox Text="Popular Words"/></TreeViewItem.Header>
            <TreeViewItem><TreeViewItem.Header><TextBox Text="Foo"/></TreeViewItem.Header></TreeViewItem>
            <TreeViewItem><TreeViewItem.Header><TextBox Text="Bar"/></TreeViewItem.Header></TreeViewItem>
            <TreeViewItem><TreeViewItem.Header><TextBox Text="Hello"/></TreeViewItem.Header></TreeViewItem>
        </TreeViewItem>
        <TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBox Text="Unpopular Words"/></TreeViewItem.Header>
            <TreeViewItem><TreeViewItem.Header><TextBox Text="Work"/></TreeViewItem.Header></TreeViewItem>
            <TreeViewItem><TreeViewItem.Header><TextBox Text="Duplication"/></TreeViewItem.Header></TreeViewItem>
        </TreeViewItem>
    </TreeView>

    <TextBox Text="Last Line" Grid.Row="2" />
</Grid>

Ответы [ 2 ]

7 голосов
/ 19 мая 2011

Если вы посмотрите на обработчик TreeView.OnKeyDown с помощью ILSpy / Reflector, вы сможете увидеть причину ваших проблем. TreeView имеет специальную обработку при нажатии Shift + Tab. Соответствующий код:

Key key = e.Key;
if (key != Key.Tab) {
    // ... 
}
else {
    if (TreeView.IsShiftKeyDown && base.IsKeyboardFocusWithin &&
        this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous))) {
        e.Handled = true;
        return;
    }
}

К сожалению, вам нужно использовать собственный класс TreeView, чтобы обойти это. Примерно так работает:

public class MyTreeView : TreeView {
    protected override void OnKeyDown(KeyEventArgs e) {
        if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0 && e.Key == Key.Tab)
            return;

        base.OnKeyDown(e);
    }
}
0 голосов
/ 21 октября 2015

Вам не нужно использовать пользовательский класс, унаследованный от TreeView:

treeView.PreviewKeyDown += this.HandleTreeView_PreviewKeyDown

вместе с:

private void HandleTreeView_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Shift)
        && e.Key == Key.Tab)
    {
        var focusedElement = Keyboard.FocusedElement;
        if (focusedElement != null)
        {
            focusedElement.MoveFocus(FocusNavigationDirection.Previous, 1);
        }

        e.Handled = true;
    }
}

Также отлично работает.

С помощью этого решения вы можете, например, создать собственное поведение и присоединить его к TreeView.

...