在wp7中加载大量图像时内存不足异常

时间:2013-06-12 13:52:03

标签: image silverlight windows-phone-7 windows-phone-8 bitmapimage

我正在加载大量图片,例如250+,并且会出现内存异常。

我的代码:

while (kount < imageItems.Count)
{
    for (int i = 0; i < _grid.RowDefinitions.Count; i++)
    {
        BitmapImage bit=null;
        for (int j = 0; j < _grid.ColumnDefinitions.Count; j++)
        {
            imgGrd = new Image();
            bit = new BitmapImage(new Uri(imageItems[kount].thumb_attachment, UriKind.RelativeOrAbsolute));
            imgGrd.Source = bit;

            imgGrd.Stretch = Stretch.UniformToFill;

            _grid.Children.Add(imgGrd);
            Grid.SetRow(imgGrd, i);
            Grid.SetColumn(imgGrd, j);
            //bit = null;
            //imgGrd.Source = null;
            kount++;
         }     
     }
}

如何克服这个问题。提前谢谢..

2 个答案:

答案 0 :(得分:1)

有关强制释放图像使用的内存的详细信息,请参阅http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx

答案 1 :(得分:0)

您不应该一次创建所有图像。手机可以为您创建和处理图像。这是通过使用一些内置的ItemsControl控件完成的。其中最受欢迎的是ListBox。为了让ListBox创建和处理你需要创建一个将创建图像的DataTemplate的项目。

<ListBox ItemsSource="{Binding ImageItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding thumb_attachment}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

您可以让手机处理此问题,而不是循环浏览ImageItem并手动创建图像。这要求您创建一个对象以将页面绑定到具有ImageItems属性的对象。

public class MainViewModel // Should probably implement INotifyPropertyChanged
{
    public IEnumerable<ImageItem> ImageItems { get; set; }
}

这样你的页面就可以将它的DataContext设置为MainViewModel。

如果要在网格中显示项目,则可以将ListBox的ItemsPanelTemplate更改为Windows Phone Toolkit中的WrapPanel。

<ListBox.ItemsPanelTemplate>
    <toolkit:WrapPanel />
</ListBox.ItemsPanelTemplate>