【问题标题】:Navigate listboxitems using arrow Keys使用箭头键导航列表框项
【发布时间】:2013-08-26 16:43:50
【问题描述】:

我的用户控件具有带有图像的列表框作为 ListboxItems,当我使用“箭头键”导航列表框项目(图像)时,我遇到了一个问题,我无法导航下一行中存在的项目,例如,列表框包含多行图像*(“我用过 WrapPanel”)*,如果我使用 右箭头键导航图像我不能能够移动到下一行,

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

【问题讨论】:

    标签: wpf navigation listboxitem arrow-keys


    【解决方案1】:

    基于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"

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

    【讨论】:

    • ,感谢您的回复,在我的项目中,我们正在处理带有 windowsAPI 级别的 keydown/keypres..etc,这是另一个应用程序,所以我不能编写特定于我的应用程序的 Keydown 事件,我是寻找,必须在XAML本身中完成,是否可以在XAML文件中完成??
    • 我不知道你会怎么做(或者如果可能的话)只在 XAML 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多