在wpf中,如何在Tab键顺序中获取下一个控件

时间:2011-04-22 14:26:44

标签: wpf tab-ordering

我知道如何将 设置 焦点设置为Tab键顺序中的下一个控件,但我实际上并不想更改焦点...我只是想 获取 Tab键顺序中的下一个控件(也许也可以获得前一个,第一个和最后一个。)所以... howyadodat?

中号

3 个答案:

答案 0 :(得分:1)

@pameron说,

PredictFocus(FocusNavigationDirection.Next)不起作用。我基于@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);

答案 1 :(得分:0)

我认为不能以Tab键顺序使用下一个控件,但是你可以循环子集合并使用KeyboardNavigation.GetIsTabStop(..) KeyboardNavigation.GetTabIndex()为它创建一个帮助器。

答案 2 :(得分:0)

PredictFocus应该在.NET 4中获得Tab支持,但current MSDN暗示它没有。然而,这可能是文件疏忽;我没试过,但你可以试一试。

如果这不起作用,KeyboardNavigation上有一个私人方法可能对你有所帮助;你将不得不使用反射来调用它,并且你需要正确的代码访问权限来执行它,但它可能会起作用。 .NET Reflector将签名显示如下:

private DependencyObject GetNextTab(DependencyObject e, DependencyObject container, bool goDownOnly)

其中e是您要获取下一个标签的元素,container是其父容器。我不是100%确定goDownOnly做了什么,但是我猜测它表示你不想离开父容器。如果该元素没有下一个选项卡,则该方法将返回null。

请记住,这是一种私人方法;下一版本非常容易发生变化。

修改:您需要一个KeyboardNavigation的实例!完全忘记了这一点。在FrameworkElement.KeyboardNavigation有一个静态的,但它也是内部的,所以要反思它。