我正在加载大量图片,例如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++;
}
}
}
如何克服这个问题。提前谢谢..
答案 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>