6

我有一个带有以下 xaml 的窗口:

<Window x:Class="TestDemoApp.TreeViewWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TreeViewWindow" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="Control" x:Key="FocusedStyle">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle StrokeThickness="1"
                              Stroke="Red"
                              StrokeDashArray="1 2 3 4"
                              SnapsToDevicePixels="true"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style TargetType="TreeViewItem">
            <Setter Property="IsTabStop" Value="True"/>
            <Setter Property="Focusable" Value="True"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusedStyle}"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/>
        </Style>
        <Style TargetType="ListViewItem">
            <Setter Property="IsTabStop" Value="True"/>
            <Setter Property="Focusable" Value="True"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusedStyle}"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue"/>
        </Style>
    </Window.Resources>

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

        <ListView TabIndex="1" BorderThickness="5" Focusable="True" IsTabStop="True" KeyboardNavigation.TabNavigation="Continue" FocusVisualStyle="{StaticResource FocusedStyle}">
            <ListViewItem TabIndex="2" Content="List Item 1"/>
            <ListViewItem TabIndex="3" Content="List Item 2"/>
        </ListView>

        <TreeView TabIndex="6" BorderThickness="5" Focusable="True" IsTabStop="True" KeyboardNavigation.TabNavigation="Continue" Grid.Row="1" FocusVisualStyle="{StaticResource FocusedStyle}">
            <TreeView.Items>
                <TreeViewItem TabIndex="7" Header="Tree Item 1">
                    <TreeViewItem Header="Tree Item 11"></TreeViewItem>
                    <TreeViewItem Header="Tree Item 12"/>
                </TreeViewItem>
                <TreeViewItem Header="Tree Item 2">
                </TreeViewItem>
            </TreeView.Items>
        </TreeView>
    </Grid>
</Window>

当我运行程序时,标签顺序是:

1.列表视图
2. 清单项目 1
3. 清单项目 2
4. 树视图
5. 树项目 1
6. 树项目 2

7. 列表视图(#1)
8. 列出第 1 项(#2)
9. 清单项目 2 (#3)
10. 树项目 2 (6#)

11+ 重复 #7 - #10

预期的行为是它会在进一步迭代时从 #1 重复到 #6,但是它会在任何后续迭代中跳过 #4 和 #5。

为什么是这样?我该如何解决?

4

1 回答 1

3

哇,这太丑了。WPF 树视图在很多方面都是我最喜欢这个形容词的目标,但我以前没有遇到过这个特殊问题。

我认为你不能比Continuefor做得更好KeyboardNavigation.TabNavigation,唯一的另一种可能性是Local,这也不起作用。请参阅此 msdn 文章。此外,Cycle项目和Continue控件上的组合并没有产生我想要的结果。

很明显,当焦点回到listview时,被选中的item被保留在treeview中,而当treeview下次接收到焦点时,它直接将焦点传递给之前选中的item(Tree Item 2),与listview不同,它保留了选择,但首先正确地聚焦控件,然后是项目。

因此,一个可能对您有用的快速而肮脏的技巧是当它失去焦点时从树视图中删除选择。不幸的是,每次所选项目更改时都会触发该事件,但黑客仍然有效。

<TreeView (...) LostFocus="TreeView_LostFocus">

后面的代码:

private void TreeView_LostFocus(object sender, RoutedEventArgs e)
{
    TreeView tv = (TreeView)sender;
    TreeViewItem item = tv.SelectedItem as TreeViewItem;
    if (item != null)
        item.IsSelected = false;
}
于 2013-05-10T12:54:14.140 回答