滚动到UWP的ListView中的新项目

超级JMN

我正在使用包含消息的ListView创建聊天应用程序。发送/接收新消息时,ListView应该滚动到新消息。

我正在使用MVVM,所以ListView看起来像

<ScrollViewer>
    <ItemsControl Source="{Binding Messages}" />
</ScrollViewer>

我该怎么做?

编辑:我试图使此版本在创建行为之前的周年更新之前的版本中。这是我到目前为止所拥有的:

public class FocusLastBehavior : Behavior<ItemsControl>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Items.VectorChanged += ItemsOnVectorChanged;
    }

    private void ItemsOnVectorChanged(IObservableVector<object> sender, IVectorChangedEventArgs @event)
    {
        var scroll = VisualTreeExtensions.FindVisualAscendant<ScrollViewer>(AssociatedObject);
        if (scroll == null)
        {
            return;
        }

        var last = AssociatedObject.Items.LastOrDefault();

        if (last == null)
        {
            return;
        }

        var container = AssociatedObject.ContainerFromItem(last);


        ScrollToElement(scroll, (UIElement)container);
    }

    private static void ScrollToElement(ScrollViewer scrollViewer, UIElement element,
        bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null)
    {
        var transform = element.TransformToVisual((UIElement)scrollViewer.Content);
        var position = transform.TransformPoint(new Point(0, 0));

        if (isVerticalScrolling)
        {
            scrollViewer.ChangeView(null, position.Y, zoomFactor, !smoothScrolling);
        }
        else
        {
            scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
        }
    }
}

该代码使用UWP Community Toolkit中的VisualTreeExtensions

但是,调用TransformPoint之后的位置始终返回 {0, 0}

我究竟做错了什么?

DK。

从Windows 10版本1607开始,您可以使用ItemsStackPanelItemsUpdatingScrollModeKeepLastItemInView,这似乎是最自然的工作。

MS UWP文档(2017-2-8)中有一个``反向列表''示例,可以归结为以下XAML:

<ListView Source="{Binding Messages}">
   <ListView.ItemsPanel>
       <ItemsPanelTemplate>
           <ItemsStackPanel
               VerticalAlignment="Bottom"
               ItemsUpdatingScrollMode="KeepLastItemInView"
           />
       </ItemsPanelTemplate>
   </ListView.ItemsPanel>
</ListView>

附带说明一下,是的,我同意您可能要摆脱a,ScrollViewer因为它作为ListView包装是多余的

更新:

KeepLastItemInView对于“周年纪念版”之前针对Windows 10的应用程序不可用。在这种情况下,确保列表在更改项目集合后始终显示最后一个项目的一种方法是覆盖OnItemsChanged并调用ScrollIntoView基本实现如下所示:

using System.Linq;
using Windows.UI.Xaml.Controls;

public class ChatListView : ListView
{
    protected override void OnItemsChanged(object e)
    {
        base.OnItemsChanged(e);
        if(Items.Count > 0) ScrollIntoView(Items.Last());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 CustomListViewAdapter 时以编程方式滚动到 ListView 中的项目

RecyclerView滚动到添加新项目时的位置

WinRT:将Listview滚动到项目

如何滚动到UWP中的元素

Flutter:滚动到ListView中的小部件

无法查看或滚动到ScrollViewer中的项目

添加新项目时,Android Firebase聊天RecyclerView自动滚动到底部

ListView 向上滚动刷新,向下滚动以向列表添加新项目

ListView XAML UWP中缺少垂直滚动

QScrollArea:从项目滚动到项目

如何在不滚动到顶部的情况下将新项目添加到recyclerview

在顶部添加新项目后,Recycler视图未滚动到顶部,因为尚未对列表适配器进行更改

UWP 中 ListView 项目的 DoubleTapped 事件

Flutter,ListView,如何在ListView的顶部添加几个项目并使它不滚动到顶部

无滚动的 UWP ListView

Espresso:如何按索引滚动到HorizontalScrollView中的项目?

如何检测用户何时滚动到RecyclerView中的最高项目

滚动到 SwiftUI 列表中的特定部分和项目

滚动到Ionic 2中ListiVew的特定项目

滚动到 RecyclerView 中的项目,将其放置在屏幕中央

在 RecyclerView 中检测当前滚动到哪个项目

IntelliJ 2019 滚动到项目选项菜单中缺少的源

Android Espresso listView滚动到

如何允许UWP ListView滚动到最后一项?

当异步添加新项目时,UICollectionView快速滚动在单元格中显示错误的图像

recycleview中的Diffutil,如果添加了新项目,则使其自动滚动

如何在可滚动的 flexbox 容器中获取新项目以显示最新的最低端(包括 Fiddle)

Listview-如何从第10个项目平滑滚动到顶部?

Flutter ListView 小部件在将项目滚动到屏幕外时重置图标