我知道如何将焦点设置到选项卡顺序中的下一个控件,但我实际上并不想更改焦点...我只想获取选项卡顺序中的下一个控件(也许获取上一个,第一个和最后一个也是。)那么... howyadodat?
米
我知道如何将焦点设置到选项卡顺序中的下一个控件,但我实际上并不想更改焦点...我只想获取选项卡顺序中的下一个控件(也许获取上一个,第一个和最后一个也是。)那么... howyadodat?
米
PredictFocus(FocusNavigationDirection.Next)
不像@Cameron 所说的那样工作。我基于@Randolpho 的帖子的包装代码现在运行良好。
我尝试了几种模式,最后得出结论,我必须确保container
实际上是其中的父母之一,e
以避免意外结果。
/// <summary>
/// Get next tab order element.
/// </summary>
/// <param name="e">The element to get next tab order</param>
/// <param name="container">The container element owning 'e'. Make sure this is a container of 'e'.</param>
/// <param name="goDownOnly">True if search only itself and inside of 'container'; otherwise false.
/// If true and next tab order element is outside of 'container', result in null.</param>
/// <returns>Next tab order element or null if not found</returns>
public DependencyObject GetNextTab(DependencyObject e, DependencyObject container, bool goDownOnly)
{
var navigation = typeof(FrameworkElement)
.GetProperty("KeyboardNavigation", BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(null);
var method = navigation
.GetType()
.GetMethod("GetNextTab", BindingFlags.NonPublic | BindingFlags.Instance);
return method.Invoke(navigation, new object[] { e, container, goDownOnly }) as DependencyObject;
}
前任。)
var nextElement = GetNextTab(textbox1, window, false);
我认为不可能按 Tab 键顺序设置下一个控件,但是您可以循环访问子集合并使用 KeyboardNavigation.GetIsTabStop(..)
KeyboardNavigation.GetTabIndex()
为 thet 创建一个助手。
PredictFocus
应该在 .NET 4 中获得 Tab 支持,但当前的 MSDN暗示它没有。然而,这可能是文件疏忽;我没试过,但你可以试一试。
如果这不起作用,那么有一个私有方法KeyboardNavigation
可能会对您有所帮助;您必须使用反射来调用它,并且您需要适当的代码访问权限才能执行此操作,但它可能会起作用。.NET Reflector 显示签名如下:
private DependencyObject GetNextTab(DependencyObject e, DependencyObject container, bool goDownOnly)
e
您要为其获取下一个选项卡的元素在哪里,并且container
是它的父容器。我不是 100% 确定会发生什么goDownOnly
,但我想这表明您不想离开父容器。如果该元素没有下一个选项卡,该方法将返回 null。
请记住,这是一个私有方法;下一个版本非常容易发生变化。
编辑:你需要一个KeyboardNavigation
! 完全忘记了这一点。有一个静态的FrameworkElement.KeyboardNavigation
,但它也是内部的,所以要反思一下。