我有一个带有四个枢轴的枢轴页面。在两个枢轴中,我有一个ListBox,我以网格的形式填充信息。我将ListItem绑定到一个ObservableCollection,它充满了从WCF异步获取的信息。
但是,当设置了DataContext并且UI正在使用数据填充ListBox时,UI似乎会冻结。 ListItems越多,冻结的时间越长。
编辑:Calrification。我仍然可以向上/向下滚动页面,但我无法滑动以导航到不同的轴。在UI解冻后发生转换。
有没有办法在不冻结UI的情况下填充ListBox?
编辑:一些示例代码松散地解释了会发生什么。
列表框
<ListBox Name="lbInterruptYesterday" ScrollViewer.VerticalScrollBarVisibility="Disabled"
ItemsSource="{Binding Interrupts}"
ItemTemplate="{StaticResource InterruptListItem}" Tap="Interrupt_OnTap">
</ListBox>
Interrupts是一个包含Interrupt对象的ObservableCollection。
InterruptListItem包含一个带有TextBlocks的网格,该文本绑定到Interrupt-object中的变量。
我通过异步调用WCF来获取数据。完成后我做:
(sender, e) => Deployment.Current.Dispatcher.BeginInvoke(() =>
{
//Some code handling the result which I put in the ObservableCollection
Production.Interrupts.add(new Interrupt());
//Set the DataContext
DataContext = Production;
});
当设置DataContext时,UI会冻结,直到更新为止。
答案 0 :(得分:0)
此可能因为ObservableCollection
正在触发一个事件,导致UI在您添加的每个项目上进行更新。如果添加大量项目,则可能非常耗时。解决方案是创建一个更聪明的ObservableCollection,您可以在事件触发方面暂停和恢复。这是一个example你可以试试看它是否有帮助。