2013-01-02 47 views
2

我有以下的可視化樹:爲什麼UIElement.MoveFocus()不會將焦點移動到ListBox中的下一個兄弟元素?

<DockPanel> 
    <TextBox Name="ElementWithFocus" DockPanel.Dock="Left" /> 
    <ListBox DockPanel.Dock="Left" Width="200" KeyUp="handleListBoxKeyUp"> 
     <ListBoxItem>1</ListBoxItem> 
     <ListBoxItem>4</ListBoxItem> 
     <ListBoxItem>3</ListBoxItem> 
     <ListBoxItem>2</ListBoxItem> 
    </ListBox> 
    <TextBox DockPanel.Dock="Left" /> 
</DockPanel> 

handleListBoxKeyUp如下:

private void handleListBoxKeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     ((UIElement)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    } 
} 

ListBox具有鍵盤焦點(真ListBoxItem我猜),按Enter將焦點移到ListBox中的第一項,而不是以下的TextBox。爲什麼會發生這種情況,我如何才能使Enter密鑰在Tab這裏起作用?

回答

7

,而不是在發送者打電話MoveFocus,你應該把它在事件參數發現原來源。

sender參數將始終是ListBox本身,並呼籲該MoveFocusFocusNavigationDirection.Next會去的樹,這是第一ListBoxItem下一個控件。

路由事件的原始源將被選定ListBoxItem,之後下一個控制是要獲得焦點的TextBox

((UIElement)e.OriginalSource).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
+0

這就像一個魅力。感謝您的洞察力。 – codekaizen

+0

也許你可以告訴我爲什麼WPF認爲'ListBoxItem'不僅僅是下一個兄弟'ListBoxItem'後的下一個控件? – codekaizen

+1

如果使用FocusNavigationDirection.Down或FocusNavigationDirection.Up代替Next,焦點將在ListBoxItems上向上/向下移動。接下來似乎擊中與原點不在同一水平的下一個控制器。 –

0

讓代碼進入下一個文本框的另一種方法是手動提高選項卡事件。與我下面的工作更換你的代碼,如果語句中:

KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab); 
args.RoutedEvent = Keyboard.KeyDownEvent; 
InputManager.Current.ProcessInput(args); 
+0

我會考慮這一點,但我一般不喜歡更換輸入,因爲它可能會導致意想不到的副作用與像自適應屏幕閱讀器的輸入濾波器。 – codekaizen

相關問題