0

我正在加载大量图像,比如 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++;
         }     
     }
}

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

4

2 回答 2

1

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

于 2013-06-12T15:25:21.583 回答
0

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

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

您无需循环遍历您的 ImageItems 并手动创建图像,而是允许手机处理此问题。这要求您创建一个对象以将您的页面绑定到具有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>
于 2013-06-13T05:07:56.210 回答