Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么UIElement.MoveFocus()不将焦点移动到列表框中的下一个同级元素?_.net_Wpf_Keyboard Events - Fatal编程技术网

.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));