Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 班次+;选项卡在TreeView控件中不工作_C#_Wpf_Treeview_Navigation - Fatal编程技术网

C# 班次+;选项卡在TreeView控件中不工作

C# 班次+;选项卡在TreeView控件中不工作,c#,wpf,treeview,navigation,C#,Wpf,Treeview,Navigation,我无法在包含文本框的树视图中使用Shift+Tab进行向后导航,使用Tab进行向前导航可以正常工作,并在树视图中从文本框跳到文本框。当树状视图中的一个文本框使用Shift+Tab时,焦点将移动到树状视图外的上一个控件,而不是树状视图内的上一个控件 此外,它的唯一一个Shift+Tab导航无法正常工作,Ctrl+Shift+Tab按预期顺序正常工作 对我做错了什么有什么建议吗 示例代码: <Window x:Class="TestTabTreeView.MainWindow" xml

我无法在包含文本框的树视图中使用Shift+Tab进行向后导航,使用Tab进行向前导航可以正常工作,并在树视图中从文本框跳到文本框。当树状视图中的一个文本框使用Shift+Tab时,焦点将移动到树状视图外的上一个控件,而不是树状视图内的上一个控件

此外,它的唯一一个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>


如果使用ILSpy/Reflector查看TreeView.OnKeyDown处理程序,可以看到问题的原因。按下Shift+Tab键时,TreeView具有特殊处理功能。有关守则如下:

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);
    }
}

您不必使用从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;
    }
}
也很好用

例如,使用此解决方案,您可以创建自定义行为并将其附加到树视图