You can use ScrollTo
in a ListView
to scroll to a any position you set. You need to overwrite the OnAppearing
method. This is an example for scrolling to the end of the ListView
ViewModel.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);
});
}
};
}
Then just call RefreshScrollDown
(which is System.Action
) every time you need to scroll down, e.g. when you receive a new message or when you load the chats.
RefreshScrollDown in ViewModel:
public System.Action RefreshScrollDown;
You can get your ViewModel in code behind like this:
private MessagePhonePageViewModel ViewModel {
get { return BindingContext as MessagePhonePageViewModel;}
}
NOTE: There is a bug when using a fixed ListView
height. When changing the HeightRequest
, ScrollTo still uses the original height of the list to calculate where it scrolls to. The original height is not updated when you change the value in HeightRequest
. To fix this issue:
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();
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…