2015-08-21 93 views
1

我正在開發一個Universal Win App,並且這個問題出現在兩個平臺上。我有一個ObservableCollection與產品,對象屬性綁定從xaml DataTemplate和ObservableCollection被設置爲ItemsSource到GridViewGridView內存不足,大量的ObservableCollection

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> 

另外我有一種分頁設置,這使得每個時間滾動高度等於垂直偏移請求。而我做

foreach (var item in requestResult.products) 
{ 
    productList.Add(item); 
} 

添加新項目的ObservableCollection這似乎直到我達到一定數量的物品,做工精細。之後,該應用程序崩潰。在2GB RAM設備上崩潰之前,我的應用程序的內存消耗高達800Mb。在512Mb ram上它早先崩潰了。

我該如何解決這個問題?我需要改變我做這個分頁的方式嗎?或者可以通過小的修改來修復它。我想這個問題是與圖像,但不知道。是不是CacheMode =「BitmapCache」應該修復內存問題?

+1

動畫控件時,才應使用BitmapCache。在這種情況下,沒有必要使用它。你是否啓用了虛擬化? –

+0

你應該把你的GridView的ItemsPanel設置爲'ItemsStackPanel' –

+0

忘了提及我有ItemsPanel作爲ItemsWrapGrid。但我使用它的MaximumRowsOrColumns屬性。 ItemsStackPanel沒有。 – garenyondem

回答

1

您的GridViewvirtualization已損壞,因爲您將它包裝在ScrollViewer中,並且所有項目都立即呈現(並使用更多內存)。

如果你只留下以下XAML你不會有任何更多的內存問題:

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

感謝這是一個我不知道的好點。似乎很好地解決了內存問題。但我必須使用Viewbox來使我的GridView兩列與水平strech(所以完全填充屏幕)。你知道任何正確的方法來實現這一點嗎? – garenyondem

+0

在GridView上指定* Horizo​​ntalAlignment =「Stretch」*和* Horizo​​ntalContentAlignment =「Stretch」* * –