2017-04-01 4 views
2

Eine UWP-App, eine Sammlung von Ansichtsmodellen, wird instanziiert und im Konstruktor der Seite gefüllt. Jeder Artikel hat eine Eigenschaft namens ImageSource vom Typ BitmapImage, initialisiert auf einen neuen BitmapImage(). Die Ansicht enthält eine an die Sammlung gebundene Rasteransicht. In der Ansicht ist ein DataTemplate für die Elemente der Sammlung definiert. Insbesondere zeigt die DataTemplate ein Bild, dessen Quelle an die Eigenschaft des Objekts ImageSource gebunden ist. Die DataTemplate verarbeitet auch Ereignisse von Image, sodass ein Platzhalter angezeigt wird, während das Bild noch geladen wird. Die Seite Loaded-Ereignis den Download aller Bildquelle löst:uwp verzögertes Laden von Bildquellen

 private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
     { 
      foreach (ImageViewModel imageViewModel in this.imageViewModels) 
      { 
       IRandomAccessStream randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id); 
       await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream); 
      } 
     } 

In diesem Code eine Instanz von IRandomAccessStream wird von einem langsamen Anbieter abgerufen wird, wie ein HttpClient in einem langsamen Netzwerk hören.

Die Image.Quelle in der Ansicht ist an die imageViewModel.ImageSource des obigen Codes gebunden. Auf diese Weise muss jedes Bild auf den vorherigen warten, bevor es mit dem Herunterladen seiner eigenen Quelle beginnt.

Wie ist es möglich, dass alle Bilder sofort heruntergeladen werden können, ohne dass sie auf die anderen warten müssen?

Die einzige Idee, die ich hatte, war eine faule Implementierung von IRandomAccessStream zu erstellen, aber ich wandere, wenn es einen besseren Weg gibt, es zu tun.

Danke!

+1

Werfen Sie einen Blick auf 'ImageEx' Control von [UWP Gemeinschaft Toolkit] (http://www.uwpcommunitytoolkit.com/en/ Master/Kontrollen/ImageEx /). Vielleicht wird das helfen. – AVK

+0

Danke. Der ImageEx verfügt über Funktionen zum Anzeigen eines Platzhalters während des Ladens des Bildes, scheint jedoch das Problem des Ladens von Bildsätzen nicht auf eine asynchrone und effiziente Weise zu lösen. –

+0

Naja, Meine App lädt 50 Bilder mit einer Größe von ~ 300 KB herunter, die als Sets ohne den Bildschirm hängen und in meiner GridView mit Lazy Implementation geladen werden. Probieren Sie die Beispiel-App aus und prüfen Sie, ob sie Ihren Anforderungen entspricht. – AVK

Antwort

1

Die Bilder werden nur einzeln heruntergeladen, da die foreach keine weitere Iteration startet, bis beide await-Anweisungen abgeschlossen sind. So fordern alle Bilder downloaden gleichzeitig und warten, bis sie asynchron zu vervollständigen versuchen Sie Folgendes:

private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) { 
    var setImageTasks = this.imageViewModels.Select(async imageViewModel => { 
     var randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id); 
     await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream); 
    }).ToArray(); 
    await Task.WhenAll(setImageTasks); 
} 
Verwandte Themen