Windows Phone 8应用程序中的内存泄漏

时间:2014-03-13 13:13:36

标签: c# windows-phone msdn

我正在尝试创建一个包含Image及其详细信息的列表框。 这是代码:

<ListBox x:Name="GalleryImages" ItemsSource="{Binding}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" Orientation="Vertical" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid VerticalAlignment="Top">
                    <Image Source="{Binding Path=ImageSrc}" Height="200" Width="480" Stretch="Fill"/>
                    <Border BorderThickness="5" BorderBrush="White" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" >
                        <StackPanel HorizontalAlignment="Center" Background="White" Opacity="0.6">
                            <TextBlock Text="{Binding Path=Time}" Foreground="Black" HorizontalAlignment="Center" Padding="10,5,10,0" FontSize="12" />
                            <TextBlock Text="{Binding Path=Day}" Foreground="Black" HorizontalAlignment="Center"  FontSize="45" FontWeight="Bold" Padding="10,0,10,10" Margin="0,-10,0,-18"/>
                            <TextBlock Text="{Binding Path=MonthAndYear}" Foreground="Black" HorizontalAlignment="Center" FontSize="17" Padding="10,0,10,5"/>
                        </StackPanel>
                    </Border>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

后备代码是:

public class Item
    {
        public ImageSource ImageSrc { get; set; }
        public string Time { get; set; }
        public string Day { get; set; }
        public string MonthAndYear { get; set; }
    }

//Creating a New Item
//Added the time,day, monthandyear
//Now adding the image source
//This will be looped each time for each image

Item item = new Item();
using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
{
     if (ISF.DirectoryExists("SomeDirectory"))
     using (IsolatedStorageFileStream FS = ISF.OpenFile("SomeDirectory/" + "SOMERANDOMIMAGENAME", FileMode.Open, FileAccess.Read))
     {
            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(FS);
            item.ImageSrc = bitmap;
      }
 }

最后将项目逐个绑定到列表框之前创建:

 Dispatcher.BeginInvoke(() => GalleryImages.Items.Add(item));

现在的问题是: 如您所见,所有列表框图像都是使用新的位图图像从隔离存储中提取的,然后将其设置为item.ImageSrc。但是当项目超过25时会产生内存泄漏,应用程序在显示图像后崩溃

我到现在为止做了什么,

  1. 添加了virtualizingstackpanel,但不适用于25以上的图片。
  2. 在将项目添加到GalleryImage(ListBox)项目之后设置item.ImageSrc = null,但这也使得ListBox的图像也为空。
  3. 对于超过1000的图像,我还能做些什么呢?

1 个答案:

答案 0 :(得分:1)

在处理包含图像的集合时,不仅要显示占用大量内存的集合的UI控件,还要自行收集集合。因此,除了Data Virtualization之外,请尝试查看UI Virtualization

使用数据虚拟化,并非集合中的所有项目一次都会加载到内存中。只加载了一部分,当前需要显示的部分加上几个下一个项目 buffer