Xaml 在UWP中,如何跳过UserControl及其所有子元素的tab键导航?
在UWP中,我希望动态处理和跳过特定控件集的tab键导航 例如,我的主页上有两个用户控件(都有很多子控件,将动态添加),我想在特定场景下动态跳过一个用户控件的tab键导航 因此,我尝试将该用户控件的“IsTabStop”设置为false。但对其子控件无效。仍然选项卡键焦点在该UserControl的子控件中移动 注意:如果我将“IsEnabled”设置为false,那么它将正常工作。但我不想使用,因为它会影响视觉效果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
提前感谢。在
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);
}
}