[英]In UWP, how to skip tab key navigation for an UserControl and all of its child element?
在 UWP 中,我想动态处理和跳过特定控件集的 Tab 键导航。
例如,我的主页中有两个用户控件(两者都有很多将动态添加的子项),并且想在特定场景中暂时跳过一个用户控件的 Tab 键导航。
所以我试图将“ IsTabStop ”设置为该 UserControl 的 false。 但这对其子控件无效。 仍然 Tab 键焦点移动到该 UserControl 的子项内。
注意:如果我将“IsEnabled”设置为 false,则它可以正常工作。 但我不想使用,因为它会影响视觉外观。
提前致谢。
StackPanel
类中没有IsTabStop
属性。 IsTabStop
属性在Windows.UI.Xaml.Controls.Control类中定义,并且StackPanel
类不是从Control
类直接或间接继承的。 您不能使用IsTabStop
属性来设置StackPanel
实例。
因此,如果您想跳过一个堆栈面板的 Tab 键导航,您需要在IsTabStop
中的每个控件中将IsTabStop
属性设置为False
。
更新:
经测试, UserControl
的子元素不能继承IsTabStop
属性的值。 因此,您不能通过将IsTabStop
属性设置为 False 来跳过UserControl
所有子元素的 Tab 键导航。
您可以使用UserControl
类中的方法IsTabStop
将UserControl
每个项目的IsTabStop
设置为 false 。
例如:
我的用户控件.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
实例的名称以False
调用SetIsTabStop(bool flag)
方法。
userControlName.SetIsTabStop(false);
更新:
也许您可以尝试以下解决方法。
在您的Page
为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
的第一个子UserControl
之外的子UserControl
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.