Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does UIElement.MoveFocus() not move the focus to the next sibling element in a ListBox?

I have the following visual tree:

<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 is the following:

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

When the ListBox has keyboard focus (really a ListBoxItem I'd guess), pressing Enter moves the focus to the first item in the ListBox instead of to the following TextBox. Why is this happening and how can I get the Enter key to act like Tab here?

like image 796
codekaizen Avatar asked Dec 12 '22 19:12

codekaizen


1 Answers

Rather than calling MoveFocus on the sender, you should call it on the original source found in the event args.

The sender parameter will always be the ListBox itself, and calling MoveFocus on that with FocusNavigationDirection.Next will go to the next control in the tree, which is the first ListBoxItem.

The original source of the routed event will be the selected ListBoxItem, and the next control after that is the TextBox that you want to receive focus.

((UIElement)e.OriginalSource).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
like image 156
Peter Hansen Avatar answered May 18 '23 19:05

Peter Hansen