具有大量 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" />
我正在开发一个 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>
我还有一种分页设置,每次可滚动高度等于垂直偏移量时都会发出请求。我通过
将新项目添加到 ObservableCollectionforeach (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" />