【问题标题】:AutoScroll to Bottom a ListView in WinRT App自动滚动到 WinRT 应用程序中的 ListView 底部
【发布时间】:2013-07-30 18:52:02
【问题描述】:

每次将新项目添加到ItemsSource 时,我都在努力使ListView 自动向下滚动到底部。根据this post,我所要做的就是使用以下内容:

private void ScrollToBottom() 
{ 
    var scrollViewer = MyListView.GetFirstDescendantOfType<ScrollViewer>(); 
    scrollViewer.ScrollToVerticalOffset(scrollViewer.ScrollableHeight); 
}

使用WinRT XAML Toolkit。但是每次从 ListView 的项目集合中添加或删除元素时,我都会调用此方法。但是没有自动滚动。

在 XAML 中,还有 ListView :

<ScrollViewer>
    <ListView x:Name="LinesListView"
        ItemsSource="{Binding Lines}"
        ItemTemplate="{StaticResource LineItemTemplate}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel>
                    <StackPanel.ChildrenTransitions>
                        <TransitionCollection>
                            <EntranceThemeTransition/>
                        </TransitionCollection>
                    </StackPanel.ChildrenTransitions>
                 </StackPanel>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>
</ScrollViewer>

另一方面,在我上面提供的同一链接上还有另一个解决方案,但即使我尝试在 XAML 中指定它,它也不会显示列表视图项动画。

我在这里错过了什么?

非常感谢您的任何建议,谢谢。

【问题讨论】:

  • 你知道listview最新的item是什么吗?
  • 是的,它们都很好,绑定工作正常,它只是......不向下滚动,这就是为什么我不知道以及如何解决它......
  • 我认为您可能会在项目完全添加和创建之前滚动。您也许可以创建一个覆盖 OnItemsChanged 的​​自定义 ListView 以确保它在项目进入后滚动。

标签: c# listview windows-8 windows-runtime autoscroll


【解决方案1】:

终于找到了办法:

我不得不摆脱 ScrollViewer,当添加项目时,我首先必须更新 ListView 的布局,然后向下滚动:

myListView.UpdateLayout();
myListView.ScrollToBottom();

ScrollToBottom();方法在WinRT XAML Toolkit中实现。

很简单,虽然我用许多其他方法来解决它......

通过 XAML 中的一些更改修复了动画问题:

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel>
            <StackPanel.Transitions>
                <TransitionCollection>
                    <AddDeleteThemeTransition/>
                 </TransitionCollection>
            </StackPanel.Transitions>
        </StackPanel>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

【讨论】:

    【解决方案2】:

    在我使用的 Windows 商店应用程序中 listViewReceiptDetailList.ScrollIntoView(listViewReceiptDetailList.Items[listViewReceiptDetailList.Items.Count() - 1]);

    【讨论】:

      【解决方案3】:

      尝试将ListViewExtensions.ItemToBringIntoView(WinRT XAML 工具包的附加属性)绑定到您添加的项目。

      【讨论】:

      • 感谢您的回答,但我不够熟练,无法管理应用您的解决方案。但是,我找到了一个使用 WinRT XAML 工具包的解决方案,我会将其作为答案发布,以防万一它对其他人有所帮助。
      • @Filip 还有更多信息吗?看起来很完美,但不能让它工作,它确实滚动,但到顶部,当它应该在底部时!从谷歌找不到太多信息...
      • 在内部它调用listView.ScrollIntoView(newItemToBringIntoView) 这是平台API,我认为它会做最小的滚动以使项目可见,这意味着它可能位于视口的顶部或底部,如果它不是' t 已经在视图中,具体取决于当前偏移量。如果您希望它显示在特定位置 - 您需要找到滚动查看器,获取项目容器相对于滚动查看器的位置并滚动,如stackoverflow.com/questions/24033120/…
      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 2018-02-27
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多