带有图像泄漏的列表框内存崩溃时出现OutofMemoryException

时间:2014-04-20 05:37:10

标签: c# xaml windows-phone-8

在我的WP8应用程序中,我有一个带有lisbox的页面,其中我将ItemTemplate中的图像列表与其他数据绑定在一起。一旦我离开页面,我觉得这些图像不会从内存中释放出来。

以下是代码详情:

XAML

<ListBox x:Name="userList" ItemTemplate="{StaticResource DataTemplate1}" Tap="userList_Tap" Loaded="userList_Loaded">
       <StackPanel Orientation="Horizontal" Width="220" Height="220" HorizontalAlignment="Center" VerticalAlignment="Center" >
                <Image x:Name="episodeImage" HorizontalAlignment="Right" Height="120" Margin="0" VerticalAlignment="Top" Width="120" Source="{Binding DefaultImagePath}" />
                <TextBlock x:Name="episodeName" HorizontalAlignment="Left" Margin="4,0,0,36" TextWrapping="Wrap" Width="Auto" Foreground="White" FontFamily="Segoe WP" Text="{Binding ImageName}" VerticalAlignment="Bottom"/>
        </StackPanel>
</ListBox>

C#数据背后:

public class ImageHolder{
    public BitmapImage DefaultImagePath { get; set; }
    public string ImageName { get; set; }
}


// list binding
List<ImageHolder> images=Utils.GetLargeImages();
userList.ItemSource=images;


public static List<ImageHolder> GetLargeImages(){
    List<ImageHolder> images= new List<ImageHolder>();
        for (int i = 0; i < 10; i++)
        {
            ImageHolder hold=new ImageHolder();
            hold.ImageName=i+"";

            hold.DefaultImagePath = new BitmapImage
            {
                DecodePixelWidth = 120,
                DecodePixelHeight = 120,
                UriSource = new Uri("Image_"+i+".png", UriKind.RelativeOrAbsolute)  // this image is in 400x400 size
            };
            images.Add(hold);               
        }
     return images;
}

我在(GetLargeImages()方法)中的图像提取过程中使用了DecodePixelWidth和DecodePixelHeight。

onnavigatedfrom方法我将null设置为Listbox。但无法帮助它,经过几次进出页面,我的应用程序崩溃了OutofMemoryException。

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        userList.ItemsSource = null;

    }

1 个答案:

答案 0 :(得分:0)

尝试通常不应该做的事情。通过调用垃圾收集器。

            GC.Collect();

当您导航到另一个页面以移除导航背斜时,您也可以尝试删除导航堆栈,这应该删除您页面的所有知识,从而在返回时强制重新实例化列表和页面。