2011-04-22 29 views
6

所有接下来的控制,我知道如何设置将焦点Tab顺序的下一个控件,但我真的不希望改变焦点。 ..我只是想得到下一个控制按Tab键顺序(也许得到先前的,第一个也是最后一个。)所以... howyadodat?在WPF中,我怎么能得到Tab键顺序

中号

+0

顺便问一下,你如何将焦点设置到下一个的UIElement? – 2011-04-22 14:42:05

+0

想法:编写一个遍历算法,它按照Tab顺序(一次)将UIElements添加到列表中。然后查看列表中的控件并查看下一个是谁。 – 2011-04-22 14:43:14

回答

0

我不认为是可能在Tab顺序的下一个控件,但你可以对孩子的收集和循环利用KeyboardNavigation.GetIsTabStop(..)KeyboardNavigation.GetTabIndex()创造泰德的帮手。

0

PredictFocus应该在.NET 4中获得Tab支持,但current MSDN意味着它没有。然而,这可能是文件监督。我没有尝试过,但你可以尝试一下。

如果这不起作用,KeyboardNavigation上有一个私人方法,可能会对你有所帮助;您必须使用反射来调用它,并且您需要正确的代码访问权限才能执行此操作,但它可能有效。 .net反射揭示了签名如下:

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

哪里e是要获得下一个选项卡中的元素,container是它的父容器。我不是100%确定goDownOnly是干什么的,但我猜想它表明你不想离开父容器。如果该元素没有下一个选项卡,该方法将返回null。

请记住,这是一种私人方法;高度易受变化而来的下一个版本。

编辑:你需要一个KeyboardNavigation的实例!完全忘记了这一点。在FrameworkElement.KeyboardNavigation有一个静态的,但它也是内部的,所以反思就可以了。 @Cameron说:

+0

文档不是疏忽 - 它仍然会在.NET 4中抛出一个InvalidEnumArgumentException异常 – Cameron 2011-08-09 15:56:56

0

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);