UWP应用程序加载更快的图像?

时间:2016-04-27 09:06:04

标签: c# image performance win-universal-app

我正在为通用Windows平台编写一个应用程序,我需要加载一些图像以显示在列表中。现在我的问题是这个加载对用户来说太长了。我目前使用绑定设置了XAML中图像的来源,如下所示:{Binding Image}

我只能访问全分辨率图像,因此我想知道是否有办法在将这些图像放在UI上之前使这些图像更小,因此只有较小的图像需要保留在内存中。有没有办法配置Image UI元素,以便它自己执行此大小调整?

此外,有没有办法懒洋洋地加载这些图像,因为现在我的UI被加载这些图像阻止。

编辑:我用来将我的本地图片加载到我的Image(这是ListView.ItemTemplate内)的代码:

<Image
    Grid.Row="0"
    Source="{Binding Image}"
    Stretch="Uniform"
    VerticalAlignment="Center"/>

2 个答案:

答案 0 :(得分:3)

您可以使用转换器延迟加载和调整图像大小。 In是您可以使用的转换器的开始。有了这个,懒人加载就完成了。但是,我没有准备好调整大小示例。

转换代码

class LoadAttachmentAsyncConverter : IValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, string language)
    {
        Task<BitmapImage> taskToExecute = GetImage(<some parameter>);
        //Possibly handle some other business logic
        return new NotifyTaskCompletion<BitmapImage>(taskToExecute);
    }

    public async Task<BitmapImage> GetImage(object someParameter) {
        BitmapImage image = new BitmapImage();
        //do (async stuff) to fill the image;
        return image;
    }
}

XAML代码

<Image Source="{Binding Result}" DataContext="{Binding converterObjValue, Converter={StaticResource ConverterName}}"/>

要实施调整大小,您可以在此处找到信息:https://social.msdn.microsoft.com/Forums/en-US/490b9c01-db4b-434f-8aff-d5c495e67e55/how-to-crop-an-image-using-bitmaptransform?forum=winappswithcsharp

答案 1 :(得分:1)

您也可以在虚拟机中进行延迟加载。

    // You can also use BitmapImage directly, if you'd like to make reloading faster and don't care memory usage.
    private WeakReference<BitmapImage> image;

    public BitmapImage Image
    {
        get
        {
            BitmapImage image;
            if(this.image != null && this.image.TryGetTarget(out image))
                return image;
            image = new BitmapImage();
            this.image = new WeakReference<BitmapImage>(image);
            var ignore = Task.Run(()=>
            {
                //Load image here.
                //Don't forget to use Dispatcher while calling SetSourceAsync() or setting Source.
            });
            return image;
        }
    }