GridView内存中有大量的ObservableCollection

时间:2015-08-21 10:17:22

标签: c# xaml windows-runtime windows-phone-8.1 windows-8.1

我正在开发一个Universal Win App,这个问题出现在两个平台上。我有一个带有产品的 ObservableCollection ,对象属性是从xaml DataTemplate 绑定的,ObservableCollection被设置为ItemsSource到 GridView

private ObservableCollection<Product> productList = new ObservableCollection<Product>();

绑定的产品也有图像。

<Image
    CacheMode="BitmapCache"
    Source="{Binding ImageUrl}"
    Stretch="Uniform" />

GridView的

<ScrollViewer
    x:Name="ProductList_GridView_ParentScrollViewer"
    VerticalScrollBarVisibility="Hidden"
    Grid.Row="1">
    <StackPanel
       VerticalAlignment="Stretch"
       HorizontalAlignment="Stretch">
       <Viewbox
           AllowDrop="False"
           ScrollViewer.HorizontalScrollMode="Disabled"
           ScrollViewer.HorizontalScrollBarVisibility="Hidden"
           ScrollViewer.VerticalScrollBarVisibility="Hidden"
           ScrollViewer.VerticalScrollMode="Disabled"
           Stretch="UniformToFill">
               <GridView
                   x:Name="ProductList_GridView"
                   Margin="15,9.5,15,0" />
      </Viewbox>
   </StackPanel>
</ScrollViewer>

此外,我还有一种分页设置,每次可滚动高度等于垂直偏移时都会发出请求。我通过

ObservableCollection 添加新项目
foreach (var item in requestResult.products)
{
  productList.Add(item);
}

这似乎工作正常,直到我达到一定数量的项目。之后,应用程序崩溃了。在崩溃2GB ram设备之前,我的应用程序内存消耗高达800Mb。在512Mb ram上它早先崩溃了很多。

我该如何解决这个问题?我是否需要改变这种分页的方式。或者可以通过微小的变化来修复。我想问题出在Image上,但不确定。是不是 CacheMode =&#34; BitmapCache&#34; 应该修复内存问题?

1 个答案:

答案 0 :(得分:1)

您的GridView virtualization已被破坏,因为您将其包裹在ScrollViewer中,并且所有项目都会立即呈现(并使用更多内存)。

如果您只留下以下XAML,则不会再出现内存问题:

<GridView
   x:Name="ProductList_GridView"
   Margin="15,9.5,15,0" />