注意:通用 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>
我试过了:
将列表设置为空
清除列表(通过调用 ListViewName.Clear() )
ViewModelLocator 中的调用清理
什么有效,但不能应用:在 ViewModel 中,我添加了另一个类型为
ObservableCollection<BitmapImage>
,然后将 ListView 绑定到此集合。通过这种方式,所有的图像都会被加载到 RAM 中,不会锁定文件,但它会导致一个严重的问题:消耗过多的 RAM。通过直接绑定到 BitmapImage,我的应用程序使用 URI 绑定占用了大约 100 MB RAM 到 900 MB RAM。此外,加载到页面所需的时间更长,因为它必须在列表完成呈现之前读取所有图像文件并将其加载到 RAM 中。
那么,如何在 Windows 10 中配置 Image Control 呢?
PS:这个图像控件:MSDN中的Image Class