我正在开发一个仅依赖于键盘导航的WPF(VB)程序。
在我的程序中,我有一个列表框,最多可显示20000个项目。
我想要的是当列表框具有键盘焦点时,我移动到可见的底部项目(使用ArrowDown),我希望焦点移动到列表框外的下一个项目。我正在使用PgUp和PgDown滚动列表框内容,并使用文本搜索跳转到项目。
有没有办法检测焦点/所选项目是否是列表框中的最后/第一个可见项目?
如果是这样,我可以使用:
ListBox1.MoveFocus(New TraversalRequest(FocusNavigationDirection.Down))
答案 0 :(得分:2)
我建议您不要这样做,用户界面应该与操作系统中的其他用户界面一致。
如果您想出一个与用户界面在目标操作系统上的行为一致的备用用户界面,那么您的用户会更好。
答案 1 :(得分:0)
从您的解释中可以清楚地看到,但要么是您正在寻找:
如果( 1 )是您的目标,则可能有一个合理的解决方案,使用触发器和/或基于所选项目和所选项目更改的事件的一些自定义代码处理。如果情况确实如此,我将不得不同意Tom,并建议您不要以这种方式实现它,因为如果没有以编程方式删除焦点,最后一项将无法选择。
如果您正在寻找( 2 ),那么根据我的经验,ListBox的自然行为是在按下Tab键时移动到下一个控件并且我已经测试了这个对于向下箭头键也是如此。当我到达列表中的最后一项时,焦点会从列表框中弹出,并根据它的父项弹出到下一个控件。
UPDATE:我必须撤回原来的评论,因为我上面描述的行为没有描述ListBox中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>
偶然的情况下,这恰好有你所描述的行为,因为列表中的每个项目的行为几乎就像一个控件直接作为对象放置到所有其他控件。
答案 2 :(得分:0)
我使用一个简单的技巧将焦点移到Listbox之外: 我禁用列表框,以便焦点自动移动到下一个控件,然后我再次启用列表框:)
Lst.IsEnabled = False
Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
Lst.IsEnabled = True