所有接下来的控制,我知道如何设置将焦点Tab顺序的下一个控件,但我真的不希望改变焦点。 ..我只是想得到下一个控制按Tab键顺序(也许得到先前的,第一个也是最后一个。)所以... howyadodat?在WPF中,我怎么能得到Tab键顺序
中号
所有接下来的控制,我知道如何设置将焦点Tab顺序的下一个控件,但我真的不希望改变焦点。 ..我只是想得到下一个控制按Tab键顺序(也许得到先前的,第一个也是最后一个。)所以... howyadodat?在WPF中,我怎么能得到Tab键顺序
中号
我不认为是可能在Tab顺序的下一个控件,但你可以对孩子的收集和循环利用KeyboardNavigation.GetIsTabStop(..)
KeyboardNavigation.GetTabIndex()
创造泰德的帮手。
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说:
文档不是疏忽 - 它仍然会在.NET 4中抛出一个InvalidEnumArgumentException异常 – Cameron 2011-08-09 15:56:56
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);
顺便问一下,你如何将焦点设置到下一个的UIElement? – 2011-04-22 14:42:05
想法:编写一个遍历算法,它按照Tab顺序(一次)将UIElements添加到列表中。然后查看列表中的控件并查看下一个是谁。 – 2011-04-22 14:43:14