【问题标题】:Windows IOT/UWP Refreshing a GridView on a timer without the page blinkingWindows IOT/UWP 在计时器上刷新 GridView 而页面不闪烁
【发布时间】:2019-07-19 00:07:29
【问题描述】:

我已经实现了 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 重新获取数据。如果我在按钮或 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 而不会出现这种烦人的刷新闪烁?

谢谢

【问题讨论】:

  • 您使用的是什么设备?或者这会发生在任何设备上吗?
  • It 设备是 Raspberry Pi 3 B+,这是它正在使用的设备
  • 好的。 Raspberry Pi 没有加速图形驱动程序;这可能是根本原因。我很想看看它在其他设备上是否也能做到这一点,我不知道你测试起来有多容易。
  • 我也在笔记本电脑上启动了这个应用程序,刷新时它做同样的事情,所以它似乎与 pi 无关。
  • 好的,很好。这个地方由微软监控,所以我相信他们会提供帮助。为了提供帮助,我没有尽可能多地使用 C#。

标签: gridview uwp iot uwp-xaml windows-10-iot-core


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你的问题出在这一行:

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

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

    【讨论】:

    • 不,它工作正常,滚动条位置也被记住了。
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多