Xaml 在UWP中,如何跳过UserControl及其所有子元素的tab键导航?

Xaml 在UWP中,如何跳过UserControl及其所有子元素的tab键导航?,xaml,uwp,focus,windows-10-universal,uwp-navigation,Xaml,Uwp,Focus,Windows 10 Universal,Uwp Navigation,在UWP中,我希望动态处理和跳过特定控件集的tab键导航 例如,我的主页上有两个用户控件(都有很多子控件,将动态添加),我想在特定场景下动态跳过一个用户控件的tab键导航 因此,我尝试将该用户控件的“IsTabStop”设置为false。但对其子控件无效。仍然选项卡键焦点在该UserControl的子控件中移动 注意:如果我将“IsEnabled”设置为false,那么它将正常工作。但我不想使用,因为它会影响视觉效果 提前感谢。在StackPanel类中没有IsTabStop属性。IsTabSt

在UWP中,我希望动态处理和跳过特定控件集的tab键导航

例如,我的主页上有两个用户控件(都有很多子控件,将动态添加),我想在特定场景下动态跳过一个用户控件的tab键导航

因此,我尝试将该用户控件的“IsTabStop”设置为false。但对其子控件无效。仍然选项卡键焦点在该UserControl的子控件中移动

注意:如果我将“IsEnabled”设置为false,那么它将正常工作。但我不想使用,因为它会影响视觉效果


提前感谢。

StackPanel
类中没有
IsTabStop
属性。
IsTabStop
属性是在类中定义的,而
StackPanel
类不是直接或间接从
Control
类继承的。您不能使用
IsTabStop
属性设置
StackPanel
实例

因此,如果要跳过一个stackpanel的tab键导航,则需要在stackpanel中的每个控件中将
IsTabStop
属性设置为
False

更新:

通过测试,
UserControl
中的子元素不能继承
IsTabStop
属性的值。因此,您不能通过将
IsTabStop
属性设置为False来跳过
UserControl
中所有子元素的选项卡键导航

您可以使用
UserControl
类中定义的方法为
UserControl
中的每个项目将
IsTabStop
设置为false

例如:

MyUserControl.cs

public void SetIsTabStop(bool flag)
{
    var result = VisualTreeFindAll<Control>(this);
    foreach (var item in result)
    {
        item.IsTabStop=flag;
    }
}
private IList<T> VisualTreeFindAll<T>(DependencyObject element)
            where T : DependencyObject
{
    List<T> retValues = new List<T>();
    var childrenCount = VisualTreeHelper.GetChildrenCount(element);
    for (var i = 0; i < childrenCount; i++)
    {
        var child = VisualTreeHelper.GetChild(element, i);
        var type = child as T;
        if (type != null)
        {
            retValues.Add(type);
        }
        retValues.AddRange(VisualTreeFindAll<T>(child));
    }
    return retValues;
}
更新:

也许您可以尝试以下解决方法

页面中为
UserControl
添加
KeyDown
事件处理程序

 private void UserControl_KeyDown (object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Tab)
        {
            e.Handled = true;
            button1.Focus(FocusState.Keyboard);
        }
    }

您需要让除
UserControl
之外的第一个控件及其所有子控件获得焦点,然后按键导航将跳过
UserControl
中的子控件,除了
UserControl
中的第一个子控件。我重新考虑了我的问题。实际上,我用UserControl代替StackPanel,UserControl有很多子控件,这些子控件将动态添加。因此,在我们的应用程序场景中,不可能将每个&每个子控件的IsTabStop设置为false。父用户控制级别中是否有任何解决方案句柄IsTabStop?我将更新答案。您可以查看更新是否满足您的要求。我已经考虑过这种方法(更新所有可视子控件)。但是我们的父用户控件有很多&很多子控件。因此,遍历整个可视树将严重影响性能。有没有其他有效的方法来处理这个问题?我更新了答案。您可以查看更新是否满足您的要求。您的问题是否已解决?如果问题没有解决,请随时与我们联系。
 private void UserControl_KeyDown (object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Tab)
        {
            e.Handled = true;
            button1.Focus(FocusState.Keyboard);
        }
    }