2016-04-27 55 views
4

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

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

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

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

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

不知道这是否会有所帮助 - 但也许不是显示整个图像,显示缩略图? – Romasz

+0

你从哪里得到这些图像?本地或在线?阻止是发生在用户端,还是只需要很长时间才能加载这些图像。如果它采取非常长的图像的加载,也许这将帮助你:https://msdn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform -apps – wuerzelchen

+0

您是在创建BItmapImage还是绑定图片网址? – Archana

回答

2

您能延迟加载,并通过使用转换器调整图像。 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代码

​​

为了实现你可以找到的信息在这里调整大小:https://social.msdn.microsoft.com/Forums/en-US/490b9c01-db4b-434f-8aff-d5c495e67e55/how-to-crop-an-image-using-bitmaptransform?forum=winappswithcsharp

+0

什么是XAML中的converterObjValue?而且我可以在“执行异步填充图片”中放置调整大小的代码,对吧? – vrwim

+0

converterObjValue是传递到转换器的对象。我用这种方法传递用户信息,所以我可以从互联网上检索缩略图。 你确实可以把调整大小的代码放在那里yes –

+0

这将绑定DataContext就像一个普通的绑定,对吧? (我在这个绑定的东西不太流利) – vrwim

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; 
     } 
    }