填充ListBox时冻结的UI

时间:2013-02-18 08:37:16

标签: silverlight windows-phone-7

我有一个带有四个枢轴的枢轴页面。在两个枢轴中,我有一个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会冻结,直到更新为止。

1 个答案:

答案 0 :(得分:0)

可能因为ObservableCollection正在触发一个事件,导致UI在您添加的每个项目上进行更新。如果添加大量项目,则可能非常耗时。解决方案是创建一个更聪明的ObservableCollection,您可以在事件触发方面暂停和恢复。这是一个example你可以试试看它是否有帮助。