Windows IOT / UWP Обновление GridView по таймеру без мигания страницы - PullRequest
0 голосов
/ 25 февраля 2019

Я реализовал INotifyCollectionChanged для привязки к моей ObservableCollection, которая все работает нормально.Однако мои данные о моей коллекции поступают из веб-сервиса JSON, и есть другие системы, которые обновляют его, а также мое приложение.Поэтому мне нужно время от времени обновлять JSON для своей коллекции.

Я могу обновить коллекцию с помощью таймера, который все работает нормально, однако, когда я делаю это, экран мигает, поскольку я предполагаю, что он перерисовываетЭкран, который выглядит ужасно, поэтому мне стало интересно, есть ли способ его остановить.Очевидно, что интерфейс INotifyCollectionChanged не слишком помогает в этой ситуации, так как приложение не изменило коллекцию, но может иметь другое приложение, поэтому мне нужно обновить свою коллекцию, чтобы она была актуальной, прежде чем я внесу какие-либо дальнейшие изменения, где я могу использоватьинтерфейс INotifyCollectionChanged и остановите мигание обновления!

Некоторый код, если это помогает, ниже моя коллекция ObservableCollection:

private WebJSON _webjson;    
private ObservableCollection<Group> _groups;
    private ObservableCollection<Group> Groups
    {
        get { return _groups; }
        set
        {
            if (_groups != value)
            {
                _groups = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Groups)));
            }
        }
    }
public event PropertyChangedEventHandler PropertyChanged;

В моем главном конструкторе у меня есть:

public TestPage()
    {
        this.InitializeComponent();

        DispatcherTimer timer;
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(60000);
        timer.Tick += async (s, e) =>
        {
            Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());
        };
        timer.Start();
}

Это бит, который мигает или мигает на экране, когда таймер обновляет данные из моего класса webjson.Webjson.GetGroupsAsync - это класс, который переходит к JSON API и получает данные. Я не включил этот код, поскольку не считаю его актуальным.

Все обновления, которые я выполняю в приложении, работаютхорошо, это просто получение данных заново из JSON API по таймеру, которое вызывает мерцание экрана.То же самое происходит, если я реализую обновление вручную на кнопке или на панели команд и т. Д.

Тогда я просто использую x: Bind для привязки данных к GridView, как вы это сделали.

Iтакже пытался использовать стандартный таймер, и когда он запускает вызов:

private async Task Refresh()
    {
 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async () =>
         {
             Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());

         });
    }

и происходит то же самое мигание / мигание.

Есть ли в любом случае повторное получение данных из JSON API и обновление моегоgridview без этого раздражающего обновления мигает?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Ваша проблема в этой строке:

Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());

Лучшее решение - сравнить содержимое ваших новых и предыдущих групп, а затем соответственно добавить / удалить / заменить элементы.Хотя вы можете отключить анимацию, как вы это сделали, это может вызвать другие проблемы (например, я думаю, что положение полосы прокрутки таким образом не запомнится).

0 голосов
/ 26 февраля 2019

Для тех, у кого такая же проблема, я только что решил.Это до переходов по умолчанию.Таким образом, в вашем GridView вы просто отключаете переходы, и кажется, что проще всего установить ItemContainerTransitions в GridView на пустую коллекцию, например:

<GridView.ItemContainerTransitions>
    <TransitionCollection />
</GridView.ItemContainerTransitions>

Тогда, как по волшебству, мигание обновления исчезло!

...