4

我有以下视觉树:

<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

4

2 回答 2

12

而不是调用MoveFocus发送者,您应该在事件 args 中找到的原始源调用它。

参数将sender始终是它ListBox本身,调用MoveFocuswithFocusNavigationDirection.Next将转到树中的下一个控件,即 first ListBoxItem

路由事件的原始来源将是 selected ListBoxItem,之后的下一个控件是TextBox您想要获得焦点的控件。

((UIElement)e.OriginalSource).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
于 2013-01-02T19:26:35.450 回答
1

另一种让代码转到下一个文本框的方法是手动引发选项卡事件。用以下代码替换 if 语句中的代码对我有用:

KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab);
args.RoutedEvent = Keyboard.KeyDownEvent;
InputManager.Current.ProcessInput(args);
于 2013-01-02T19:21:34.593 回答