Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将键盘焦点从列表框移开_Wpf_Vb.net_Listbox_Keyboard_Focus - Fatal编程技术网

Wpf 将键盘焦点从列表框移开

Wpf 将键盘焦点从列表框移开,wpf,vb.net,listbox,keyboard,focus,Wpf,Vb.net,Listbox,Keyboard,Focus,我正在用WPF(VB)开发一个只依赖键盘导航的程序 在我的程序中,我有一个列表框,可以显示多达20000个项目 我想要的是,当列表框具有键盘焦点时,我移动到可见的底部项目(使用箭头向下),我希望焦点移动到列表框外的下一个项目。我使用PgUp和PgDown滚动列表框内容,使用文本搜索跳转到项目 是否有方法检测聚焦/选定的项目是否是列表框中最后/第一个可见的项目 如果是这样,我可以使用: ListBox1.MoveFocus(New TraversalRequest(FocusNavigationD

我正在用WPF(VB)开发一个只依赖键盘导航的程序

在我的程序中,我有一个列表框,可以显示多达20000个项目

我想要的是,当列表框具有键盘焦点时,我移动到可见的底部项目(使用箭头向下),我希望焦点移动到列表框外的下一个项目。我使用PgUp和PgDown滚动列表框内容,使用文本搜索跳转到项目

是否有方法检测聚焦/选定的项目是否是列表框中最后/第一个可见的项目

如果是这样,我可以使用:

ListBox1.MoveFocus(New TraversalRequest(FocusNavigationDirection.Down))

我建议您不要这样做,用户界面应该与操作系统中的其他用户界面保持一致


如果您能提供一个与目标操作系统上的用户界面行为一致的备用用户界面,您的用户会过得更好

您的解释有点清楚,但您要寻找的是:

  • 选择最后一个项目时,导航到列表框之外
  • 当尝试导航超出列表中的最后一项时,导航将从列表框中弹出 如果(1)是您的目标,那么可能有一个合理的解决方案,使用触发器和/或一些自定义代码处理基于所选项目和所选项目更改的事件。如果是这样的话,我必须同意Tom的观点,并建议您不要以这种方式实现它,因为如果不按编程方式删除焦点,最后一项将永远无法选择

    如果您希望这样做(2),那么根据我的经验,当按下Tab键时,列表框的自然行为是移动到下一个控件,我也对向下箭头键进行了测试,并且效果相同。当我到达列表中的最后一项时,焦点从列表框中弹出,并根据它的父控件转到下一个控件

    更新:我必须撤回我的原始评论,因为我上面描述的行为没有描述WPF中列表框的默认行为,但是在实现ItemsControl和指定ItemTemplate时,您将看到我上面描述的行为(我相信这就是您要寻找的行为)。看看下面的例子

    <ItemsControl ItemsSource="{Binding ElementName=TheWindow, Path=ListOStrings}">
        <ItemsControl.Template>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border BorderBrush="Magenta"
                        BorderThickness="1">
                    <ScrollViewer>
                        <ItemsPresenter />
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    
    
    

    碰巧,这恰好与您描述的行为相同,因为列表中的每个项的行为几乎都像一个控件,直接作为所有其他控件的对等项放置。

    我使用一个简单的技巧将焦点移到列表框之外: 我禁用列表框,使焦点自动移动到下一个控件,然后再次启用列表框:)

    Lst.IsEnabled = False
    Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
    Lst.IsEnabled = True