带有图像的列表框泄漏内存崩溃并出现内存外异常

本文关键字:内存 崩溃 异常 泄漏 图像 列表 | 更新日期: 2023-09-27 17:59:07

在我的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和DecodePixel Height。

onnavigatedfrom方法我正在将null设置为Listbox。但无济于事,在进出页面几次后,我的应用程序出现了内存外异常。

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

带有图像的列表框泄漏内存崩溃并出现内存外异常

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

            GC.Collect();

当你导航到另一个页面时,你也不能尝试删除导航后台,这应该会删除你页面的所有知识,从而在返回时强制重新实例化列表和页面。