注意:通用 Windows 平台 (即 Windows 10 应用,不是 WPF)
我有大约80个图像文件需要在页面内的列表视图中显示。当用户返回到上一页时,我需要释放 Image 控件,以便可以删除这些图像。
问题在于直接绑定图像 uri 会锁定图像文件,并且在返回时不会释放。
我正在使用 MVVMLight
一些代码:
public class FileNameToFullUriConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string ori = value.ToString();
string file = ori.Split('/').Last();
string img = file.Split('.')[0] + ".png";
img = "ms-appdata:///local/" + StaticClass.ImageFolder + "/" + img;
return img;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return null;
}
}
和 XAML 相关
<DataTemplate>
<Grid>
<Image x:Name="Image2"
Grid.Column="1"
HorizontalAlignment="Left"
Source="{Binding Page2.Page.file,
Converter={StaticResource FileNameToFullUriConverter},
Mode=OneWay}"
Stretch="UniformToFill" />
</Grid>
</DataTemplate>
我已经尝试过:
将列表设置为null
清空列表(通过调用ListViewName.Clear())
在ViewModelLocator中调用Cleanup
虽然有效,但无法应用的方法: 在ViewModel中,我添加了另一个类型为
ObservableCollection<BitmapImage>
首先,创建一个Collection用于存储图片的路径,然后将ListView绑定到该Collection。
通过这种方式,所有图像都将加载到RAM中,文件不会被锁定,但是会导致一个严重的问题:消耗过多的RAM。我的应用程序使用URI进行绑定时,从100 MB RAM到直接绑定到BitmapImage的900 MB RAM。此外,它需要更长的时间才能加载到页面上,因为它必须在列表完成渲染之前读取和加载所有图像文件到RAM中。
那么,在Windows 10中如何处理Image Control?
PS:此处所说的Image Control是MSDN中的Image类。