/ / Dočasne pozastaviť posúvanie na položke ItemsControl, pretože nové položky sa pridávajú do UWP - c #, xaml, windows-runtime, win-universal-app

Dočasne pozastaviť posúvanie na položke ItemsControl, pretože nové položky sa pridávajú do UWP - c #, xaml, windows-runtime, win-universal-app

Mám pozorovateľný kolekčný denník, ktorý sa vkladánové položky v hornej časti systému Windows Universal App. Umožnil som používateľom zobraziť denník tým, že ho viaže na položky kontroly. Ak je v denníku veľké množstvo prichádzajúcich aktualizácií, môže to byť ťažké, pretože bude pokračovať v rolovaní pri pridávaní nových položiek. Chcel by som pridať tlačidlo pre pozastavenie prerušenia rolovania alebo dokonca aktualizácie.

Vidím beginupdate a endupdate, ale tie lenZdá sa, že sa vzťahujú na kontroly WPF. Takisto zvažujem niečo v mojej triede logov, aby som vypol zdvihnutie udalosti zmenenej na nehnuteľnosti, ale nie som si istý, ako hladko aktualizovať všetko, čo mi bolo zmeškané, keď sa kontrola položiek nepoužíva?

odpovede:

0 pre odpoveď č. 1

Prišiel som s riešením ... Položil som položku controlcontrol do scrollviewer namiesto scrollviewer v položke ItemContainerStyle.

Takže v podstate sledujem virtuálneveľkosť vyhľadávacieho programu a sledovanie zbierky denníkov. Pri pozastavení a zmene kolekcie presuňte vertikálny posun navigačného ovládača o to, ako veľmi rástol, pričom animácia bola zablokovaná, takže pohyb nie je viditeľný, takže viditeľne zostane na tom istom mieste.

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