Sfarfallio dell’immagine nell’app di Windows RT

Ho un’app di Windows RT in cui cambio a livello di codice Bitmap nel componente Image . Tutto funziona bene con XAML e il codice sottostante tranne lo sfarfallio che vediamo quando l’immagine viene cambiata.

Cosa dovrei cambiare per sbarazzarmi dello sfarfallio?

XAML :

                                                   

Codice:

 namespace Test01 { public sealed partial class MainPage : Page { int currentSlice = 128; String axis = "ax-"; public MainPage() { this.InitializeComponent(); } public void displayImages() { BitmapImage bitmapImage = image1.Source as BitmapImage; bitmapImage.UriSource = null; image1.Source = null; BitmapImage bitmapImage2 = image2.Source as BitmapImage; bitmapImage2.UriSource = null; image2.Source = null; Uri image1Uri = new Uri(this.BaseUri, "BrainImg/axis/" + axis + currentSlice + ".jpg"); image1.Source = new BitmapImage(image1Uri); image2.Source = new BitmapImage(new Uri(this.BaseUri, "BrainImg/aseg/" + axis + currentSlice + ".png")); } protected override void OnNavigatedTo(NavigationEventArgs e) { } private void Slider_ValueChanged_1(object sender, RangeBaseValueChangedEventArgs e) { if (slider1 != null) { currentSlice = (int) slider1.Value; displayImages(); } } } } 

Ho trovato una soluzione.

 IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read); BitmapImage bitmapImage = new BitmapImage(); if (await bitmapImage.SetSourceAsync(stream)) { image1.source = bitmapImage; } 

Non c’è lo sfarfallio in questo modo.

La prima cosa che vedo è che si imposta inutilmente la sorgente dell’immagine su null prima di impostarla su un nuovo valore, anche se potrebbe non essere rilevante. Il problema è che scaricare / decodificare un’immagine richiede un momento. Quindi dovresti o precaricare tutte le immagini prima di iniziare a usarle (che potrebbe usare troppa memoria e quindi non essere fattibile) o usare due controlli immagine al posto di uno e usarli come una sorta di catena di scambio in cui hai un’immagine visibile e una che è nascosta e quando vuoi cambiare l’immagine visualizzata – aggiorna la fonte dell’immagine nascosta e cambia solo la visibilità delle immagini una volta caricata la bitmap. Potrebbe non essere semplice, visto che BitmapImage potrebbe non iniziare il caricamento fino a quando il controllo dell’immagine di hosting non sarà visibile, quindi potresti dover impostare l’opacità su 0,01 anziché nasconderlo completamente o cercare di renderlo visibile e quindi immediatamente invisibile fino a quando la bitmap non viene caricata . Se la bitmap è già stata caricata, la sua PixelWidth sarebbe> 0.