当收到新消息时,是否使ListView自动滚动到底部?

当收到新消息时,是否使ListView自动滚动到底部?,listview,xamarin.forms,Listview,Xamarin.forms,我一直在使用xamarin构建一个移动应用程序,与我的聊天机器人进行交互。我遇到的问题是,在bot和用户之间显示消息的ListView在显示新消息时不会自动滚动到底部。代码如下: 有没有办法让Listview在收到新消息时自动滚动到底?要滚动到某个项目,您只需执行以下操作: ChatListView.ScrollTo(项目,ScrollToPosition.MakeVisible,true); 如果希望列表在与可观察集合一起使用时自动滚动到新的/更新的项目,可以尝试使用以下扩展: name

我一直在使用xamarin构建一个移动应用程序,与我的聊天机器人进行交互。我遇到的问题是,在bot和用户之间显示消息的ListView在显示新消息时不会自动滚动到底部。代码如下:



有没有办法让Listview在收到新消息时自动滚动到底?

要滚动到某个项目,您只需执行以下操作:

ChatListView.ScrollTo(项目,ScrollToPosition.MakeVisible,true);
如果希望列表在与可观察集合一起使用时自动滚动到新的/更新的项目,可以尝试使用以下扩展:

namespace.Your.namespace.For.Custom.Controls
{
公共类AutoScrollListView:ListView
{
私有INotifyCollectionChanged(先前可观察到的集合);
公共AutoScrollListView(ListViewCachingStrategy cachingStrategy)
:base(cachingStrategy)
{
}
公共AutoScrollListView()
:base()
{
}
受保护的重写无效OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
base.OnPropertyChanged(propertyName);
如果(propertyName==nameof(ItemsSource))
{
if(_previousObservableCollection!=null)
{
_previousObservableCollection.CollectionChanged-=OnItemSourceCollectionChanged;
_previousObservableCollection=null;
}
如果(ItemsSource是INotifyCollectionChanged newObservableCollection)
{
_previousObservableCollection=新的ObservableCollection;
newObservableCollection.CollectionChanged+=OnItemSourceCollectionChanged;
}
}
}
私有void OnItemSourceCollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
if(e.Action==NotifyCollectionChangedAction.Add | | e.Action==NotifyCollectionChangedAction.Replace)
{
foreach(e.NewItems中的var项)
{
//滚动至刚刚添加/更新的项目以使其可见
ScrollTo(项目,ScrollToPosition.MakeVisible,true);
}
}
}
}
}
要使用它,请记住将其命名空间添加到XAML文件:


...
...
请记住,如上所述,只有当属性
ItemsSource
绑定到可观察的集合时,此自定义列表才会自动滚动


我希望有帮助

这看起来会有帮助的!为了清楚起见,我会在我的项目中创建一个“自定义”文件夹,并将AutoScrollListView代码放在其中,然后简单地将xaml元素从“Listview”更改为“AutoScrollListView”?太好了,感谢您的清晰!这将大有帮助!很乐意帮忙!请考虑到您可以通过其他许多方式实现这一点,以上只是一个建议。例如,您可以订阅视图中的某个viewmodel事件或属性,以了解何时添加了项,然后手动调用调用
ChatListView.ScrollTo(项,ScrollToPosition.MakeVisible,true)
。在试验实现时,我会记住这些。再次感谢!