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

问题描述

在UWP中,我想动态处理和跳过特定控件集的Tab键导航。

例如,我的主页上有两个用户控件(两个都有很多子控件,这些子控件将被动态添加),并且想暂时跳过一个用户控件在特定情况下的选项卡导航。

因此,我尝试将该用户控件的“ IsTabStop ”设置为false。但是,这对其子控件无效。仍然将Tab键的焦点移到该UserControl的子控件中。

注意:如果我将“ IsEnabled”设置为false,则它可以工作。但是我不想使用它,因为它会影响视觉外观。

谢谢。

解决方法

IsTabStop类中没有StackPanel属性。 IsTabStop属性是在Windows.UI.Xaml.Controls.Control类中定义的,并且StackPanel类不是直接或间接从Control类继承的。您不能使用IsTabStop属性来设置StackPanel实例。

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

更新

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

您可以在UserControl类中使用defind方法将IsTabStop中每个项目的UserControl设置为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实例的名称通过SetIsTabStop(bool flag)调用False方法。

userControlName.SetIsTabStop(false);

更新

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

在您的KeyDown中为UserControl添加Page事件处理程序。

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

您需要让除UserControl之外的第一个控件及其所有子控件获得焦点,然后按键导航将跳过UserControl中的子控件,除了{ {1}}。