private async void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { var scrollViewer = (ScrollViewer)sender; if (scrollViewer.VerticalOffset < 0.001) { LoadingRing.IsActive = true; LoadingRing.Visibility = Visibility.Visible; var skip = viewModel.Messages.Count; var item = viewModel.Messages.FirstOrDefault(); try { var request = new GetMessagesRequest { ChannelId = viewModel.SelectedChannel.Id }; var result = await HttpApi.Channel.GetMessagesAsync(request, skip, 50, HttpApi.AuthToken); for (var i = result.Count - 1; i >= 0; i--) { viewModel.Messages.Insert(0, result[i]); } MessageView.ScrollIntoView(item); } catch (ApiException ex) { await ex.ShowErrorDialog(); } finally { LoadingRing.IsActive = false; LoadingRing.Visibility = Visibility.Collapsed; } } }
private async void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "Messages") { await Task.Delay(100); MessageView.ScrollIntoView(viewModel.Messages.LastOrDefault()); } }
public ChatPage() { InitializeComponent(); viewModel = (ChatViewModel)DataContext; viewModel.PropertyChanged += ViewModel_PropertyChanged; viewModel.Recieved = async message => { await Task.Delay(100); MessageView.ScrollIntoView(viewModel.Messages.LastOrDefault()); }; MessageView.Loaded += (s, a) => { var scrollViewer = GetScrollViewer(MessageView); scrollViewer.ViewChanged += ScrollViewer_ViewChanged; }; SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible; }