具有大量 ObservableCollection 的 GridView 内存不足

GridView out of memory with large number of ObservableCollection

我正在开发一个 Universal Win 应用程序,这个问题在两个平台上都存在。我有一个包含产品的 ObservableCollection,对象属性从 xaml DataTemplate 绑定并且 ObservableCollection 被设置为 ItemsSource 到 GridView.

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

绑定的产品也有图片。

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

网格视图

<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 内存上,它崩溃得更早。

我该如何解决这个问题?我需要改变我做这个分页的方式吗?或者可以通过小的更改来修复它。我想问题出在图像上,但不确定。 CacheMode="BitmapCache" 不是应该解决内存问题吗?

您的 GridView virtualization 已损坏,因为您将其包装在 ScrollViewer 中并且所有项目都一次呈现(并使用更多内存)。

如果你只留下下面的XAML你就不会再有内存问题了:

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