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 项目。虽然您可以像这样做那样禁用动画,但这可能会导致其他问题(例如,我认为滚动条位置不会以这种方式被记住)。
我已经实现了 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 项目。虽然您可以像这样做那样禁用动画,但这可能会导致其他问题(例如,我认为滚动条位置不会以这种方式被记住)。