2016-04-27 4 views
4

Я пишу приложение для универсальной платформы Windows, где мне нужно загрузить некоторые изображения для отображения в списке. Теперь моя проблема заключается в том, что эта загрузка занимает слишком много времени для пользователя. В настоящее время я устанавливаю источник изображений в XAML, используя привязку, например: {Binding Image}.UWP приложение ускоряет загрузку изображений?

У меня только есть доступ к изображениям с полным разрешением, поэтому я хотел бы знать, есть ли способ сделать эти изображения меньше, прежде чем размещать их в пользовательском интерфейсе, поэтому только небольшое изображение должно оставаться в памяти. Есть ли способ настроить элемент пользовательского интерфейса Image, чтобы он сам выполнял это изменение размера?

Кроме того, есть ли способ загрузить эти изображения лениво, потому что теперь мой пользовательский интерфейс блокируется загрузкой этих изображений.

Edit: код, я использую, чтобы загрузить свои локальные изображения в мой Image (это внутри ListView.ItemTemplate):

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

Не уверен, что это поможет - но, возможно, вместо того, чтобы показывать целые изображения, показать их миниатюры? – Romasz

+0

Откуда у вас эти изображения? Локально или онлайн? Блокировка происходит на стороне ui, или для загрузки этих изображений требуется очень много времени. Если загрузка загружается очень долго, возможно, это поможет вам: https://msdn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform -apps – wuerzelchen

+0

Вы создаете URL-адрес образа BItmapImage или привязки? – Archana

ответ

2

Вы можете ленивым загружать и изменять размер изображения с помощью конвертера. В начало конвертера вы можете использовать. При этом ленивая загрузка выполняется для вас. Однако у меня нет примера изменения размера.

код Преобразователь

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

+0

Что такое 'converterObjValue' в XAML? И я могу поместить код изменения размера в «сделать асинхронный материал, чтобы заполнить изображение», правильно? – vrwim

+0

Преобразователь ObjValue - это объект, который передается в преобразователь.Я использовал этот метод для передачи информации о пользователе, чтобы получить миниатюру из Интернета. Вы действительно можете поставить там код изменения размера 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; 
     } 
    }