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最初の項目にフォーカスが移動します。なぜこれが起こっているのですか? どうすればキーをここのように動作させることができますか?ListBoxTextBoxEnterTab

4

2 に答える 2

12

送信者で呼び出すのではなくMoveFocus、イベント引数で見つかった元のソースで呼び出す必要があります。

senderパラメータは常にそれ自体であり、それを with でListBox呼び出すと、ツリー内の次のコントロール、つまり最初の に移動します。MoveFocusFocusNavigationDirection.NextListBoxItem

ルーティング イベントの元のソースは selectedListBoxItemになり、その後の次のコントロールは、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 に答える