Windows IOT/UWP 在页面不闪烁的情况下在计时器上刷新 GridView

Windows IOT/UWP Refreshing a GridView on a timer without the page blinking

我已经实现了 INotifyCollectionChanged 以绑定到我的 ObservableCollection,一切正常。但是,我 collection 上的数据来自 JSON 网络服务,还有其他系统更新它以及我的应用程序。因此,我需要时不时刷新JSON到我的collection。

我可以通过计时器刷新 collection,一切正常,但是当我这样做时,屏幕闪烁,因为我猜它会重绘屏幕,这看起来很糟糕,所以我想知道是否有一种阻止它的方法。显然 INotifyCollectionChanged 接口在这种情况下并没有太大帮助,因为应用程序没有更改 collection,但另一个应用程序可能有,所以我需要刷新我的 collection 以确保它在我之前是最新的在我可以使用 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 class 刷新数据时,这是闪烁或闪烁屏幕的位。 webjson.GetGroupsAsync 是 class 到 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());

         });
    }

同样的 flash/blink 发生了。

是否有来自 JSON API 的 re-get 数据并刷新我的 gridview 而没有这种烦人的刷新闪烁?

谢谢

对于遇到相同问题的任何人,我刚刚解决了这个问题。这取决于默认转换。因此,在您的 GridView 中,您只需关闭转换,最简单的方法似乎是将 GridView 的 ItemContainerTransitions 设置为空集合,例如:

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

然后就像变魔术一样,刷新闪烁消失了!

您的问题出在这一行:

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

最好的解决办法是比较新组和以前组的内容,然后相应地 add/remove/replace 项目。虽然您可以像这样做那样禁用动画,但这可能会导致其他问题(例如,我认为滚动条位置不会以这种方式被记住)。