【问题标题】:Limit tab navigation to a UI Element将选项卡导航限制为 UI 元素
【发布时间】:2018-06-06 01:32:06
【问题描述】:

我正在构建一个 UWP 应用。我目前正在努力使其更易于访问,因此我仅将其与键盘一起使用并使用 tab 键进行导航。

有时我会在整个屏幕上显示一个带有 2 个按钮的 UserControl,而将其余页面元素留在背景中。但是,如果我使用 tab 导航到这 2 个按钮,焦点会很快转到背景元素,这就是我要避免的。

我希望选项卡只关注我显示的用户控件中的这 2 个按钮。

我注意到一些框架元素(如 ContentDialog)会自动执行此操作,我希望有相同的行为。

关于如何限制 UserControl 中的选项卡导航的任何想法?

【问题讨论】:

    标签: c# xaml uwp focus


    【解决方案1】:

    当您显示UserControl 时,您可以通过将背景中存在的元素的IsTabStop 依赖属性设置为false 来触发对布局的修改。

    或者您也可以禁用背景中的元素,但这也会修改控件的外观,这可能不符合您的特定意图。

    • 如果有多种元素需要有它的 IsTabStop 设置为 false,而不是定义标识符 带有x:Name 的属性,并且必须在 代码隐藏,我建议循环通过布局Children 依赖属性并以这种方式修改控件属性。

    更新:

    我完全误解了你的要求。重新阅读后,我了解您的目标是什么,并且根据文档,这些目标似乎是可以实现的!

    查看Tab Navigation here 和Control Group 文档,表明您可以使用API​​ 的以下属性自定义控件导航:

    XYFocusKeyboardNavigation 启用箭头键导航 控制

    TabFocusNavigation表示是否有多个tab 停止或单个制表位

    FindFirstFocusableElementFindLastFocusableElement 使用 Home 键将焦点放在第一个项目上 和最后一个带有 End 键的项目

    查看模板,我们看到为 ContentDialog 定义的以下 VisualState

    <VisualState x:Name="DialogShowing">
        <VisualState.Setters>
            <Setter Target="LayoutRoot.Visibility" Value="Visible" />
            <Setter Target="BackgroundElement.TabFocusNavigation" Value="Cycle" />
        </VisualState.Setters>
    </VisualState>
    

    当显示对话框并将TabFocusNavigation 依赖属性设置为Cycle 时会出现这种视觉状态,这意味着所有子项将获得一次焦点,并且在设置属性时选项卡导航将循环这边走。

    在上面的链接中,文档很棒,每个可能的值都有一个图形表示,可以为TabFocusNavigation 设置。

    UserControl 没有按预期工作的原因是它的导航行为遵循 Local 场景的约定。

    【讨论】:

    • 我想避免这种解决方案,因为我必须恢复所有元素的 IsTapStop 原始状态,并且我想避免这种复杂性。 ContentDialog 不修改任何内容,避免焦点超出范围。
    • 您可以创建一个方法,在后台简单地切换这些元素的状态,并在 UserControl 显示/删除时调用它。但我理解你的意图,但我现在不知道是否有可能用更简单的方法来实现这一点。
    • 您能否验证是否可以在 UserControl 之外的布局中设置 XYFocusKeyboardNavigation 属性?
    • 在 UWP 中无法放置该属性,它受到更多限制。但在某种程度上,他们使用 ContentDialog 来做到这一点。
    • 嗨,使用 TabNavigation="Cycle" 解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2018-12-21
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多