8

我知道如何将焦点设置到选项卡顺序中的下一个控件,但我实际上并不想更改焦点...我只想获取选项卡顺序中的下一个控件(也许获取上一个,第一个和最后一个也是。)那么... howyadodat?

4

3 回答 3

1

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);
于 2016-10-21T07:30:30.757 回答
0

我认为不可能按 Tab 键顺序设置下一个控件,但是您可以循环访问子集合并使用 KeyboardNavigation.GetIsTabStop(..) KeyboardNavigation.GetTabIndex()为 thet 创建一个助手。

于 2011-04-22T14:42:16.540 回答
0

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,但它也是内部的,所以要反思一下。

于 2011-04-22T15:11:27.900 回答