【问题标题】:How to auto scroll ListView in UWP?如何在 UWP 中自动滚动 ListView?
【发布时间】:2019-03-15 00:13:38
【问题描述】:

我正在为我的 Raspberry Pi 创建一个 UWP。我的应用程序使用ListView 在屏幕上显示一些数据。但是,屏幕没有连接鼠标或键盘,所以我无法滚动查看整个数据。有什么办法可以自动滚动列表视图,当它到达末尾时,它会再次转到列表的开头?

<local:AlternatingRowListView>
    <local:AlternatingRowListView.ItemTemplate>
        <DataTemplate>
            <Grid Width="{Binding ActualWidth, ElementName=TableData}" Padding="10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1.5*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="3*"/>
                    <RowDefinition Height="1*"/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding UpperDescription}" FontSize="24" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" Margin="2" HorizontalAlignment="Left" Foreground="Black"/>
                <TextBlock Text="{Binding Title}" FontSize="76" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4" Margin="2" HorizontalAlignment="Left" Foreground="Black"/>
                <TextBlock Text="{Binding LowerDescription}" FontSize="24" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="4" Margin="2"  HorizontalAlignment="Left" Foreground="Black"/>
                <!--<TextBlock Text="{Binding Deadline}" FontSize="24" Grid.Row="1" Grid.Column="3" Margin="2"  HorizontalAlignment="Center" Foreground="Black"/>
                <TextBlock Text="{Binding State}" FontSize="24" Grid.Row="1" Grid.Column="4" Margin="2"  HorizontalAlignment="Center" Foreground="Black"/>-->
            </Grid>
        </DataTemplate>
    </local:AlternatingRowListView.ItemTemplate>
</local:AlternatingRowListView>

【问题讨论】:

    标签: listview uwp win-universal-app


    【解决方案1】:

    如果要滚动到列表中的特定项目,可以使用ScrollToView方法:

    listView.ScrollIntoView(item);
    

    如果您需要更精细的控制(例如监听嵌入式ScrollViewer 事件),您首先需要访问嵌入式控件:

    以下帮助方法将返回给定DependencyObject 中的第一个ScrollViewer

    public static ScrollViewer GetScrollViewer(DependencyObject dependencyObject)
    {
        if (dependencyObject is ScrollViewer scroller) return scroller;
    
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
        {
            var child = VisualTreeHelper.GetChild(dependencyObject, i);
    
            var result = GetScrollViewer(child);
            if (result != null) return result;
        }
        return null;
    }
    

    所以现在您可以像这样访问ScrollViewer

    var scrollViewer = GetScrollViewer(listView);
    

    【讨论】:

      【解决方案2】:

      有什么方法可以自动滚动列表视图,当它到达末尾时,它会再次转到列表的开头?

      我注意到您正在自己制作自定义AlternatingRowListView,这是一个好的开始。如果您想让您的 ListView 自动滚动,您可以尝试在您的自定义 AlternatingRowListView 中添加一个计时器。例如,DispatcherTimer,您可以在加载计时器时启动计时器。然后,在其Tick 事件处理程序中,您可以使用 ScrollViewer 滚动列表。

      关于如何获取ScrollViewer?我相信您已经在自定义控件类中覆盖了OnApplyTemplate 方法,您可以调用this.GetTemplateChild("ScrollViewer") as ScrollViewer 来获取其中的ScrollViwer。

      详情可参考Bottom-up list (XAML) sample

      然后,您需要手动计算是否到达终点。一旦到达终点,您可以停止计时器并滚动到列表顶部。上面的例子也涉及到部分计算,大家可以查看一下。

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2023-03-14
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2017-02-20
        相关资源
        最近更新 更多