在我的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;
}
答案 0 :(得分:0)
尝试通常不应该做的事情。通过调用垃圾收集器。
GC.Collect();
当您导航到另一个页面以移除导航背斜时,您也可以尝试删除导航堆栈,这应该删除您页面的所有知识,从而在返回时强制重新实例化列表和页面。