在UWP中,我希望动态地处理和跳过特定控件集的选项卡键导航。
例如,我的主页中有两个用户控件(两个控件都有许多子控件将被动态添加),并且希望在特定场景中跳过一个用户控件的选项卡键导航。
因此,我尝试将"IsTabStop“设置为UserControl的false。但这对它的孩子控制无效。仍然,选项卡键焦点移动到该UserControl的子程序中。
注意:如果我将"IsEnabled“设置为false,那么它就有效了。但我不想使用,因为它会影响视觉外观。
提前谢谢。
发布于 2020-11-03 09:32:05
在IsTabStop类中没有StackPanel属性。IsTabStop属性是在Windows.UI.Xaml.Controls.Control类中定义的,StackPanel类不直接或间接地从Control类继承。不能使用IsTabStop属性设置StackPanel实例。
因此,如果要跳过一个堆栈面板的选项卡键导航,则需要在堆栈面板中的每个控件中将IsTabStop属性设置为False。
更新:
通过测试,UserControl中的子元素无法继承IsTabStop属性值。因此,不能通过将UserControl属性设置为False来跳过IsTabStop中所有子元素的选项卡键导航。
您可以使用UserControl类中的defind方法为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实例的名称使用False调用SetIsTabStop(bool flag)方法。
userControlName.SetIsTabStop(false);更新:
也许你可以试试下面的解决办法。
在您的KeyDown中为UserControl添加UserControl事件处理程序。
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中的第一个子控件除外。
https://stackoverflow.com/questions/64658204
复制相似问题