Windows IOT / UWP在没有页面闪烁的计时器上刷新GridView

问题描述 投票:0回答:2

我已经实现了INotifyCollectionChanged绑定到我的ObservableCollection,这一切都正常。但是我的数据集来自JSON webservice,还有其他系统可以更新它以及我的应用程序。因此,我需要不时地将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重新获取数据,导致屏幕闪烁。如果我在按钮或CommandBar等上实现手动刷新,也会发生同样的事情。

然后我只是使用x:Bind将数据绑定到GridView,就像你一样。

我还尝试使用标准计时器,当它触发调用时:

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

         });
    }

并发生相同的闪光/闪烁。

反正有没有从JSON API重新获取数据并刷新我的gridview而没有令人烦恼的刷新闪烁?

谢谢

gridview uwp iot uwp-xaml windows-10-iot-core
2个回答
2
投票

对于有同样问题的人,我刚刚解决了。它归结为默认转换。所以在你的GridView中你只需关闭转换,最简单的方法似乎是将GridView的ItemContainerTransitions设置为空集合,例如:

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

然后就像魔术一样,刷新眨眼就消失了!


0
投票

你的问题在于这一行:

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

最佳解决方案是比较新组和先前组的内容,然后相应地添加/删除/替换项目。虽然你可以像你一样禁用动画,但这可能会导致其他问题(例如,我认为滚动条位置不会以这种方式记住)。

© www.soinside.com 2019 - 2024. All rights reserved.