.net 为什么UIElement.MoveFocus()不将焦点移动到列表框中的下一个同级元素?
我有以下可视树:.net 为什么UIElement.MoveFocus()不将焦点移动到列表框中的下一个同级元素?,.net,wpf,keyboard-events,.net,Wpf,Keyboard Events,我有以下可视树: <DockPanel> <TextBox Name="ElementWithFocus" DockPanel.Dock="Left" /> <ListBox DockPanel.Dock="Left" Width="200" KeyUp="handleListBoxKeyUp"> <ListBoxItem>1</ListBoxItem> <ListBoxItem&g
<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>
当
ListBox
具有键盘焦点时(我猜实际上是ListBoxItem
),按Enter
将焦点移动到ListBox
中的第一项,而不是移动到下面的TextBox
。为什么会发生这种情况?我如何让Enter
键在这里像Tab
一样工作?另一种让代码转到下一个文本框的方法是手动引发Tab事件。将if语句中的代码替换为以下代码对我很有用:
KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab);
args.RoutedEvent = Keyboard.KeyDownEvent;
InputManager.Current.ProcessInput(args);
您不应该在发送方上调用
MoveFocus
,而应该在事件args中找到的原始源上调用它
sender
参数将始终是ListBox
本身,并使用FocusNavigationDirection对其调用MoveFocus
。Next
将转到树中的下一个控件,即第一个ListBoxItem
路由事件的原始源将是所选的ListBoxItem
,之后的下一个控件是要接收焦点的文本框
((UIElement)e.OriginalSource).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
我考虑过这个,但是我通常不喜欢替换输入,因为它会对输入过滤器(如自适应屏幕阅读器)产生意外的副作用。如果使用FocusNavigationDirection.Down或FocusNavigationDirection.Up而不是Next,焦点将在ListBoxItems上向上/向下移动。“下一步”似乎命中了与原点不在同一级别的下一个控件。@codekaizen“下一步/上一步”类似于列表框中的Tab/Shift选项卡,不用于在项目之间导航。
((UIElement)e.OriginalSource).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));