/ / Tymczasowo wstrzymaj przewijanie elementu ItemsControl po dodaniu nowych elementów w UWP - c #, xaml, windows-runtime, win-universal-app

Tymczasowo wstrzymaj przewijanie elementu ItemsControl, gdy nowe pozycje zostaną dodane w UWP - c #, xaml, windows-runtime, win-universal-app

Mam dziennik observablecollection, który wstawianowe wpisy w górę w uniwersalnej aplikacji systemu Windows. Pozwalam użytkownikom przeglądać dziennik, wiążąc go z kontrolką items. Jeśli w dzienniku pojawi się dużo przychodzących aktualizacji, może być trudny w użyciu, ponieważ będzie on przewijany wraz z dodawaniem nowych elementów. Chciałbym dodać przycisk pauzy, aby zawiesić przewijanie, a może aktualizację.

Widzę datę początkową i datę końcową, ale tylko tewydają się mieć zastosowanie do formantów WPF. Zastanawiam się również nad czymś w mojej klasie logowania, aby wyłączyć podnoszenie zdarzenia propertychanged, ale nie jestem pewien, w jaki sposób bezproblemowo zaktualizować wszystko, co brakowało, gdy itemscontrol jest wstrzymane?

Odpowiedzi:

0 dla odpowiedzi № 1

Wpadłem na rozwiązanie ... Umieściłem itemscontrol w scrollviewerze zamiast scrollviewera w ItemContainerStyle.

Więc zasadniczo śledzę wirtualnerozmiar przewijania i śledzenie kolekcji dzienników. Po wstrzymaniu i zmianie kolekcji przesuwaj pionowe przesunięcie przewijanego ekranu o to, jak bardzo rośnie, z wyłączoną animacją, aby ruch nie był widoczny, więc widocznie pozostaje w tym samym miejscu.

    private void Page_Loaded(object sender, RoutedEventArgs e)
{
Log.Entries.CollectionChanged += Entries_CollectionChanged;
this.LogItemsControl.ItemsSource = Log.Entries;
lastExtentHeight = this.ScrollViewer.ExtentHeight;
}

private void Entries_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
lastExtentHeight = this.ScrollViewer.ExtentHeight;

if (scrollingPaused)
{
double sizeGrown = ScrollViewer.ExtentHeight - pausedExtentHeight;

pausedVerticalOffset += sizeGrown;
pausedExtentHeight = ScrollViewer.ExtentHeight;

this.ScrollViewer.ChangeView(0, pausedVerticalOffset, 1, true);
}
}

private void PlayPauseAppBarButton_Click(object sender, RoutedEventArgs e)
{
if (scrollingPaused)
{
// UnPause
scrollingPaused = false;
}
else
{
// Pause
pausedVerticalOffset = this.ScrollViewer.VerticalOffset;
pausedExtentHeight = lastExtentHeight;

scrollingPaused = true;
}
}