使用箭头键导航listboxitems

时间:2013-08-26 16:43:51

标签: wpf navigation listboxitem arrow-keys

我的usercontrol有Listbox,图像为ListboxItems,这里我遇到一个问题,当我使用“箭头键”导航列表框项目(图像)时,我无法导航下一行中存在的项目,比如说,列表框包含图像行* “我使用了WrapPanel” *,如果我使用右箭头键导航图像我不能能够进入下一行,

<ListBox.ItemContainerStyle>
   <Style TargetType="{x:Type ListBoxItem}">
   <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
   <Setter Property="IsTabStop" Value="True" />
   </Style>
</ListBox.ItemContainerStyle>

1 个答案:

答案 0 :(得分:2)

基于this answer几乎有效,但不完全。

在ListBox上放置一个KeyDown事件,当您看到右键或左键时,使用其ItemsCollection选择下一个或上一个元素。

这会移动选择,但不会移动键盘焦点(虚线),因此您还必须在具有键盘焦点的元素上调用MoveFocus

private void ListBox_KeyDown( object sender, KeyEventArgs e )
{
    var list = sender as ListBox;
    switch( e.Key )
    {
        case Key.Right:
            if( !list.Items.MoveCurrentToNext() ) list.Items.MoveCurrentToLast();
            break;

        case Key.Left:
            if( !list.Items.MoveCurrentToPrevious() ) list.Items.MoveCurrentToFirst();
            break;
    }

    e.Handled = true;
    if( list.SelectedItem != null )
    {
        (Keyboard.FocusedElement as UIElement).MoveFocus( new TraversalRequest( FocusNavigationDirection.Next ) );
    }
}

最后,请确保您的ListBox上有IsSynchronizedWithCurrentItem="True"

这将为您提供所需的环绕行为。