1

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

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

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

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

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

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

3 回答 3

2

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

如果您想出一个与用户界面在目标操作系统上的行为方式一致的替代用户界面,您的用户会更好。

于 2009-03-28T18:56:23.580 回答
0

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

Lst.IsEnabled = False
Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
Lst.IsEnabled = True
于 2014-10-23T10:09:06.557 回答
0

从您的解释中可以看出一点点,但是您正在寻找:

  1. 当最后一个项目被选中时,导航移动到列表框之外。
  2. 当尝试导航超出列表中的最后一项时,导航会从列表框中弹出。

如果 ( 1 ) 是您的目标,则可能有一个合理的解决方案,使用触发器和/或一些自定义代码处理基于所选项目和所选项目更改的事件。如果是这种情况,我将不得不同意 Tom,并建议您不要以这种方式实现它,因为如果没有以编程方式删除焦点,最后一项将永远无法选择。

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

更新:我必须撤回我的原始评论,因为我上面描述的行为没有描述 WPF 中 ListBox 的默认行为,但是它是您将看到我上面描述的行为的行为(我相信这是您正在寻找的行为)在实现 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>

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

于 2011-02-10T03:54:35.707 回答