在wpf中,如何按制表符顺序获得下一个控件

|| 我知道如何将焦点设置到选项卡顺序中的下一个控件,但是我实际上并不想更改焦点...我只想获取选项卡顺序中的下一个控件(也许获取上一个,第一个和最后一个。)那么... howyadodat? 中号     
已邀请:
Cam0ѭ不起作用,如@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);
    
我认为按制表符顺序不能具有下一个控件,但是您可以循环使用childs集合并使用
KeyboardNavigation.GetIsTabStop(..)
6来创建一个辅助对象。     
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
有一个静态的,但它也是内部的,因此请反思一下。     

要回复问题请先登录注册