2015-10-16 3 views
1

У меня есть журнал наблюдаемой коллекции, который вставляет новые записи в верхнюю часть Windows Universal App. Я разрешаю пользователям просматривать журнал, связывая его с элементом управления элементами. Если в журнале много входящих обновлений, это может быть сложно использовать, потому что он будет продолжать прокручивать по мере добавления новых элементов. Я хотел бы добавить кнопку паузы, чтобы приостановить прокрутку или, возможно, обновить.Временно приостановить прокрутку элемента ItemsControl при добавлении новых элементов в UWP

Я вижу beginupdate и endupdate, но эти, похоже, применяются к элементам управления WPF. Я также рассматриваю что-то в своем классе журналов, чтобы отключить создание события propertychanged, но я не уверен, как легко обновлять все пропущенное, когда itemcontrol не поддерживается?

+0

Вы можете просто добавить уровень косвенности, когда обновления подаются в очередь, когда список приостановлен. Не обновлять основной список. Когда это будет приостановлено, просто переместите очередь в связанный список. – WiredPrairie

ответ

0

Я придумал решение ... Я поставил элементы управления в scrollviewer вместо scrollviewer в ItemContainerStyle.

Так что в основном я отслеживаю виртуальный размер scrollviewer и отслеживает коллекцию журналов. При приостановке и изменении коллекции перемещайте вертикальное смещение scrollviewer по тому, насколько оно просто выросло, а анимация отключена, поэтому движение не видно, поэтому оно заметно остается на том же месте.

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; 
     } 
    } 
Смежные вопросы