【问题标题】:How to scroll through a listbox with down and up arrow keys in WPF?如何在 WPF 中使用向下和向上箭头键滚动列表框?
【发布时间】:2011-01-20 14:35:58
【问题描述】:

我正在使用一个 AutoCompleteBox UserControl,它使用一个弹出窗口内的列表框。一切正常,用户可以输入,查看建议的结果,然后单击检索信息的结果。

我一直在尝试添加箭头键事件处理程序,以便他们可以向下滚动通过向上和向下箭头弹出的列表框,然后按 Enter 选择结果。

我在用户输入的 TextBox 上和里面有一个 PreviewKeyDown 事件:

    If e.Key = Key.Up Then
        txtNamesListBox.Focus()
    End If

    If e.Key = Key.Down Then
        txtNamesListBox.Focus()
    End If

事件触发,我可以通过设置断点来达到这些功能,但是它不会将焦点设置到弹出的 ListBox 上,我根本无法滚动查看结果。这甚至可能吗?我的尝试是否可行?我很茫然,谢谢!

【问题讨论】:

    标签: wpf autocomplete


    【解决方案1】:

    您需要获取位于ListBox 模板内的ScrollViewer 的引用,并使用它来滚动内容。

    应该做以下事情。 (注意:我没有测试过这段代码。)

    示例:

    ScrollViewer scrollViewer = (ScrollViewer)txtNamesListBox.Template.FindControl("ScrollViewer");
    // call methods on scrollViewer
    

    编辑:

    制定了更简单的灵魂。想法是用ScrollViewer 包裹ListBox 并禁用ListBox 的滚动。

    示例:

    XAML:

    <Window x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow"
            Height="350"
            Width="525"
            Loaded="Window_Loaded">
        <Grid>
            <StackPanel>
                <RepeatButton Click="ScrollUp">Scroll Up</RepeatButton>
                <ScrollViewer Name="scrollViewer"
                              ScrollViewer.VerticalScrollBarVisibility="Hidden"
                              MaxHeight="200">
                    <ListBox Name="txtNamesListBox"
                             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                             ScrollViewer.VerticalScrollBarVisibility="Disabled"></ListBox>
                </ScrollViewer>
                    <RepeatButton Click="ScrollDown">Scroll Down</RepeatButton>
            </StackPanel>
        </Grid>
    </Window>
    

    代码背后:

    Class MainWindow
        Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            txtNamesListBox.ItemsSource = Enumerable.Range(1, 50).Select(Function(i As Int32) i.ToString())
        End Sub
    
        Private Sub ScrollDown(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + 10)
        End Sub
    
        Private Sub ScrollUp(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - 10)
        End Sub
    End Class
    

    【讨论】:

    • vb.net 中的语法是什么?
    • 哇,非常感谢。此解决方案在滚动方面效果很好,但不会突出显示列表框中的一行以供选择。这就是我真正追求的。我会继续玩弄,虽然我让它根据关键事件上下滚动效果很好。
    最近更新 更多