【问题标题】:TreeView items keyboard navigation, focus, etcTreeView 项目键盘导航、焦点等
【发布时间】:2015-08-11 13:49:43
【问题描述】:

有时我对 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>

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

  • 无法将焦点设置到按钮;
  • 当使用TextBox 从上或下通过ListViewItem 时,它会专注于UpDown 键,然后它会停留在那里永远(我看不出有什么方法可以绕过它,Tab 键对TreeView 的行为非常奇怪)。

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

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

【问题讨论】:

    标签: c# wpf navigation treeview focus


    【解决方案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 移动。能不能满足你的需求?我希望如此。

    【讨论】:

    • 非常有帮助,谢谢。 DirectionalNavigation=None 似乎禁用箭头键,将焦点放在容器内的元素上。这是最烦人的事情。有没有办法使用Tab 键进入容器并在里面的元素之间循环?我不是很喜欢Ctr+Tab(我的软件的用户也不会)。作为用户,我希望EnterTab 键将焦点放在TextBox。或者,更好的是,任何不是导航键的东西(不是箭头键、pgup/pgdown、tab、shift+tab 等)。我尝试了TabNavigation 属性的所有组合,但没有一个使Tab 聚焦文本框。
    • @Sinatr AFAIK 这些键是标准键盘导航模式的标准键。我想如果你想使用Enter 而不是Ctrl + Tab,可能你必须编写一些代码。实际上,如果您查看 KeyboardNavigation 类中的 Navigate 方法,您会发现这些键是硬编码的,并且似乎无法以简单的方式自定义它们。
    • 是的,作为用户,我希望EnterTab 能够在TreeView 中的当前选定节点内获得焦点。 Ctr+Tab 是一个非常糟糕的主意,但我理解使用它的意义,wpf 家伙想要一些东西来导航 容器(我认为 Tab 应该这样做),但是不同于Tab。我使用了您的解决方案并遇到了performance problem。不知道为什么,但是当我尝试使用 KeyboardNavigation 时,datatemplated 树视图变得非常慢。
    猜你喜欢
    • 2011-09-05
    • 2012-10-14
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多