/ / Pausiere das Scrollen vorübergehend auf einem ItemsControl, wenn neue Elemente in UWP hinzugefügt werden - c #, xaml, windows-runtime, win-universal-app

Vorübergehend pausieren Sie das Scrollen auf einem ItemsControl, wenn neue Elemente in UWP hinzugefügt werden - c #, xaml, windows-runtime, win-universal-app

Ich habe ein beobachtbares Sammlungsprotokoll, das eingefügt wirdNeue Einträge oben in einer Windows Universal App. Ich lasse Benutzer das Protokoll anzeigen, indem ich es an eine Artikelkontrolle binde. Wenn das Protokoll viele eingehende Updates enthält, kann es schwierig sein, es zu verwenden, da beim Hinzufügen neuer Elemente ein Bildlauf durchgeführt wird. Ich möchte eine Pause-Schaltfläche hinzufügen, um den Bildlauf oder das Aktualisieren anzuhalten.

Ich sehe beginupdate und endupdate, aber nur diescheinen auf WPF-Steuerelemente anzuwenden. Ich erwäge auch etwas in meiner Protokollklasse, um das Eigenschafts-Änderungsereignis zu deaktivieren, aber ich bin nicht sicher, wie ich alles, was fehlt, wenn die Artikelkontrolle nicht angehalten wurde, nahtlos aktualisiert.

Antworten:

0 für die Antwort № 1

Ich habe eine Lösung gefunden ... Ich stelle die ItemsControl in einen Scrollviewer anstelle des Scrollviewer im ItemContainerStyle.

Im Grunde verfolge ich das VirtuelleGröße des Scrollviewers und Verfolgung der Protokollsammlung. Verschieben Sie den vertikalen Versatz des Scrollviewer bei einer Pause und der Änderung der Sammlung um den Betrag, den er gerade vergrößert hat. Die Animation ist deaktiviert, sodass die Verschiebung nicht sichtbar ist, sodass sie sichtbar an derselben Stelle bleibt.

    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;
}
}