如何将ListView设置为开始在Xamarin Forms中显示最后一个项目?

Rav*_*ven 2 c# xaml xamarin xamarin.forms

我有一个由ListView处理的项目列表.默认情况下,ListView显示从开始到底部(滚动).

如何将ListView设置为从底部开始?

用法:聊天消息视图 - 其中我需要显示聊天的最后一条消息并滚动到该消息.

Den*_*öer 12

您可以ScrollTo在a 中使用ListView滚动到您设置的任何位置.您需要覆盖该OnAppearing方法.这是滚动到ListViewViewModel.Messages 末尾的示例:

protected override void OnAppearing()
    {
        base.OnAppearing();

        ViewModel.RefreshScrollDown = () => {
            if (ViewModel.Messages.Count > 0) {
                Device.BeginInvokeOnMainThread (() => {

                    ListViewMessages.ScrollTo (ViewModel.Messages [ViewModel.Messages.Count - 1], ScrollToPosition.End, true);
                });
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

然后只需RefreshScrollDownSystem.Action每次需要向下滚动时调用(这是),例如当您收到新消息或加载聊天时.

ViewModel中的RefreshScrollDown:

public System.Action RefreshScrollDown;
Run Code Online (Sandbox Code Playgroud)

您可以在后面的代码中获取ViewModel,如下所示:

private MessagePhonePageViewModel ViewModel {
    get { return BindingContext as MessagePhonePageViewModel;}
}
Run Code Online (Sandbox Code Playgroud)

注意:使用固定ListView高度时有一个错误.更改时HeightRequest,ScrollTo仍然使用列表的原始高度来计算滚动到的位置.更改值时,不会更新原始高度HeightRequest.要解决此问题:

 protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == Xamarin.Forms.ListView.HeightRequestProperty.PropertyName)
            {
                Control.LayoutParameters.Height =(int)(sender as Xamarin.Forms.ListView).HeightRequest;
                Control.RequestLayout();

            }
        }  
Run Code Online (Sandbox Code Playgroud)

  • 之前有一些报道说Android在使用ScrollToPosition.End时没有滚动到最后。如果是这种情况,请尝试 ScrollToPosition.MakeVisible (2认同)