在UWP中,我想动态处理和跳过特定控件集的Tab键导航。
例如,我的主页上有两个用户控件(两个都有很多子控件,这些子控件将被动态添加),并且想暂时跳过一个用户控件在特定情况下的选项卡导航。
因此,我尝试将该用户控件的“ IsTabStop ”设置为false。但是,这对其子控件无效。仍然将Tab键的焦点移到该UserControl的子控件中。
注意:如果我将“ IsEnabled”设置为false,则它可以工作。但是我不想使用它,因为它会影响视觉外观。
谢谢。
答案 0 :(得分:0)
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}}。