TreeView项目键盘导航,焦点等

时间:2015-08-11 13:49:44

标签: c# wpf navigation treeview focus

有时我对WPF设计师如何丢弃明显的东西感到非常失望。他们要求我们解决不应该出现问题的问题......

TreeView,就像这样简单(实际上它有数据模板,但问题可以通过这种方式重现):

<TreeView>
    <TreeViewItem Header="123" IsExpanded="True">
        <TreeViewItem Header="1" />
        <StackPanel Orientation="Horizontal">
            <TextBox Width="100" />
            <Button Content="Click"/>
        </StackPanel>
        <TreeViewItem Header="3" />
    </TreeViewItem>
</TreeView>

现在,如果您尝试仅使用键盘导航

  • 无法将焦点设置为按钮;
  • 当使用ListViewItem向上或向下传递TextBox时,它会专注于向上向下键,然后它会留在那里永远(我没有看到绕过它的方法, Tab 键对TreeView表现得非常奇怪。)

我做错了什么或者我必须使用一些秘密帮助程序类来使用户行为的默认值发生?

P.S。:我可以通过一些附加属性(又名行为)来解决这个特定问题,以预览TextBox上的按键。我想。我刚刚完成与ListView类似的事情,我很累。也许我想念其他人都知道的明显事物?然后告诉我。

1 个答案:

答案 0 :(得分:1)

我可以向你提示这个解决方案(没有额外的代码,只是标准的附加属性)。您可以使用KeyboardNavigation类及其三个附加属性。

看看这个XAML:

<TreeView>
    <TreeViewItem Header="123" IsExpanded="True">
        <TreeViewItem Header="1" />
        <StackPanel Orientation="Horizontal" KeyboardNavigation.TabNavigation="Cycle"
                                                KeyboardNavigation.ControlTabNavigation="Continue"
                                                KeyboardNavigation.DirectionalNavigation="None">
            <TextBox Width="100" Margin="5" TabIndex="1" />
            <Button Content="Click" Margin="5" TabIndex="2" />
        </StackPanel>
        <TreeViewItem Header="3" />
    </TreeViewItem>
</TreeView>

现在,我添加了保证金,以便更明显地控制哪个控件。此外,我添加了TaxIndex属性,使 Tab 键正常工作。

现在让我们看看外部TreeView的导航是如何工作的。您可以使用方向键(以通常的方式)在节点之间移动。

当您选择第二个孩子(包含StackPanel的孩子)时,您可以按 Ctrl + Tab 以“输入”该节点。第一次按下这两个键时,您将对焦TextBox。第二次关注Button。第三次“退出”节点。

此外,如果TextBoxButton被聚焦,您可以按 Tab 以在这两个控件之间循环。只要你需要 Ctrl + Tab 就可以让你打破骑行。

因此每个键都有自己的任务,您可以根据需要移动TreeView。它能适合您的需求吗?我希望如此。