c# - 在 Windows 10 中配置图像控件

标签 c# image mvvm-light windows-10 windows-10-universal

注意:通用 Windows 平台(又名 Windows 10 应用程序,而不是 WPF)

我有大约 80 个图像文件需要在页面内的 ListView 中显示。当用户返回到上一页时,我需要配置 Image 控件以便我可以删除这些图像。

问题是直接绑定(bind)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 绑定(bind)到此集合。 通过这种方式,所有的图像都会被加载到内存中,不会锁定文件,但它会导致一个严重的问题:消耗过多的内存。通过使用 URI 绑定(bind),我的应用程序通过直接绑定(bind)到 BitmapImage 占用了大约 100 MB RAM 到 900 MB RAM。此外,加载到页面的时间也更长,因为它必须在列表完成呈现之前读取所有图像文件并将其加载到 RAM 中。

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

PS:这个图片控件:Image Class in MSDN

最佳答案

您可以在页面的代码隐藏中维护一个图像控件列表。当应用程序返回时,您可以将每个图像的 Source 属性设置为 null :

<DataTemplate>
    <Grid>
        <Image Loaded="Image_Loaded" />
    </Grid>
</DataTemplate>

在后面的代码中:

private List<Image> _images = new List<Image>();

private void Image_Loaded(object sender, RoutedEventArgs e)
{
    _images.Add(sender as Image);
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    foreach(var img in _images)
    {
        img.Source = null;
    }
}

将释放所有锁。

关于c# - 在 Windows 10 中配置图像控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392123/

相关文章:

python - 将图像另存为numpy数组

css - 使用 Body Zoom 时如何使图像不缩放

mvvm - 在混合表达式中创建样本数据

c# - 在 EF 4.3 的 LINQ 查询中使用 "let"关键字

c# - C#中的类型转换对象数组成员导致异常

c# - 控制台应用程序的 Process.Start() 在 Server 2008 R2 中无法从 Windows 服务运行

.net - MVVM 在 Windows 8 应用商店应用程序中死了吗?

c# - 用于 Web 浏览器控制的 Windows C# 应用程序

swift - 无法加载从带有标识符的包中的 Nib 引用的 “” 图像

silverlight - mvvm light PassEventArgsToCommand 在 ListBox 拖放目标中中断应用程序