在 Windows 10 中配置图像控制

Tua*_*ran 5 c# image mvvm-light windows-10 windows-10-universal

注意:通用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和 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>
Run Code Online (Sandbox Code Playgroud)

我试过了:

  • 将列表设置为空

  • 清除列表(通过调用 ListViewName.Clear() )

  • 在 ViewModelLocator 中调用清理

什么有效,但无法应用:在 ViewModel 中,我添加了另一个属性,其类型为

ObservableCollection<BitmapImage>
Run Code Online (Sandbox Code Playgroud)

,然后将 ListView 绑定到该集合。通过这种方式,所有的图像都会被加载到RAM中,不会锁定文件,但它会导致一个严重的问题:消耗太多的RAM。我的应用程序使用 URI 绑定,通过直接绑定到 BitmapImage 大约需要 100 MB RAM 到 900 MB RAM。此外,加载到页面所需的时间会更长,因为它必须在列表完成渲染之前读取所有图像文件并将其加载到 RAM 中。

那么,如何在Windows 10中配置Image Control呢?

PS:这个图像控件:MSDN中的Image Class

Har*_*lse 0

我对图像控制不太熟悉。在我看来,在删除文件之前必须先处理位图图像。问题是 bitmapImage 没有 Dispose 函数。

我在堆栈溢出中看到其他人询问如何主动处理图像。我想你也必须这样做。

请参阅: 如何处置位图源

删除位图源文件