我知道如何将 设置 焦点设置为Tab键顺序中的下一个控件,但我实际上并不想更改焦点...我只是想 获取 Tab键顺序中的下一个控件(也许也可以获得前一个,第一个和最后一个。)所以... howyadodat?
中号
答案 0 :(得分:1)
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
有一个静态的,但它也是内部的,所以要反思它。