Синхронизация потока пользовательского интерфейса (сводный элемент из активного в неактивное представление)
Я хотел бы синхронизировать поток пользовательского интерфейса с изменениями в представлении (активное представление элемента 1 сводки), которое активно, когда изменения начинаются, и переходить в неактивное состояние (взаимодействие с пользователем, например, изменение элемента сводки от элемента 1 сводки до элемента 2 сводки) до окончания изменений.
Изменения никогда не происходят, и представление восстанавливается как точка при переключении из активного в неактивное состояние.
Стек пользовательского интерфейса состоит из
ScrollViewer
- сетка
- Посмотреть список
- сетка
Элементы управления сеткой содержат индикаторы выполнения для обновления
private async void scrollViewer_ViewChanged2(object sender, ScrollViewerViewChangedEventArgs e)
{
var listView = scrollViewer.GetDescendantsOfType<ListView>().FirstOrDefault();
var context = DataContext as IMainStreamViewModel;
if (e.IsIntermediate) return;
var dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
if (Math.Abs(scrollViewer.VerticalOffset) < 0.01 && _isPullRefresh)
{
// Adding item the Observable collection that is the
// the item source for the listview
// The method just add element using the core dispatcher
context.PullToRefreshInsertion_Top(dispatcher, listView);
}
else if (_scrollBar.Value >= _scrollBar.Maximum)
{
// same action but in bottom of the observable collection
// The method just add element using the core dispatcher
context.PullToRefreshAdd_Bottom(dispatcher, listView);
}
_isPullRefresh = false;
// Set the current element to be displayed in the list view
await dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => listView.ScrollIntoView(listView.SelectedItem));
// Scroll to the the listview and hidding the progress control
await Task.FromResult(scrollViewer.ChangeView(null, 60, null));
}
Наконец, элемент может быть добавлен, но просмотрщик прокрутки также не сбрасывает свою позицию и просмотр списка.
Как решить синхронизацию, я думаю, что проблема возникает из состояния IsActiveView, если элемент пользовательского интерфейса не находится в ACTIVE VIEW, он не выполняет или пропускает событие.
ОБНОВЛЕНИЕ 1:
Ситуация такова:
Элемент управления Pivot, содержащий два элемента Pivot:
- Сводная позиция 1 содержит:
- ***ScrollViewer
- ****** Сетка, содержащая пользовательский индикатор обновления
- ****** ListView, содержащий данные, которые пользователь может видеть и взаимодействовать с
- ****** Сетка, содержащая пользовательское обновление нижней панели
- Второй элемент Pivot содержит Richtextblock ...
Когда я выполняю вытягивание, чтобы обновить из сводного элемента один, и прежде чем исчезнет пользовательский индикатор выполнения, проведите пальцем к следующему элементу.
Когда я возвращаюсь к первому элементу сводки, он завис в том состоянии, когда я хочу обновить, и верхний или нижний индикатор выполнения все еще виден.
Я решил это, выполнив некоторый трюк и добавив свойство isVisible в мою модель представления, и я запускаю событие всякий раз, когда нахожусь в этом элементе сводки, я вызываю updatelayout(), и теперь это работает.
Я думаю, что проблема возникла из-за того, что когда я делаю свайп, поток пользовательского интерфейса отменяет все операции и начинает выполнять операции, связанные с активным представлением, поэтому событие обновления макета для первого элемента сводки никогда не запускается.