【发布时间】: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