所有接下來的控制,我知道如何設置將焦點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