2015-05-11 13 views
5

Ho un'applicazione WPF che acquisisce un'immagine istantanea da un file video. L'utente può definire il timestamp da cui prendere l'immagine. L'immagine viene quindi salvata in una posizione temporanea su disco e viene quindi resa in un elemento <image>.WPF Image Caching

L'utente dovrebbe quindi essere in grado di selezionare un diverso timestamp, che quindi sovrascrive il file temporaneo su disco - questo dovrebbe quindi essere visualizzato all'interno dell'elemento <image>.

Utilizzando Image.Source = null;, posso chiaro il file immagine dall'elemento <image>, in modo da visualizzare uno spazio vuoto, invece. Tuttavia, se il file immagine di origine viene quindi sovrascritto con una nuova immagine (con lo stesso nome) e caricato nell'elemento <image>, lo stato mostra ancora l'immagine precedente.

Sto usando la seguente logica:

// Overwrite temporary file file here 

// Clear out the reference to the temporary image 
Image_Preview.Source = null; 

// Load in new image (same source file name) 
Image = new BitmapImage(); 
Image.BeginInit(); 
Image.CacheOption = BitmapCacheOption.OnLoad; 
Image.UriSource = new Uri(file); 
Image.EndInit(); 
Image_Preview.Source = Image; 

L'immagine visualizzata nell'elemento <image> non cambia, anche se il file originale è stata completamente sostituita. C'è un problema di cache delle immagini qui di cui non sono a conoscenza?

risposta

9

Per impostazione predefinita, WPF memorizza nella cache BitmapImages caricati dagli URI.

È possibile evitare che impostando il flag BitmapCreateOptions.IgnoreImageCache:

var image = new BitmapImage(); 

image.BeginInit(); 
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
image.CacheOption = BitmapCacheOption.OnLoad; 
image.UriSource = new Uri(file); 
image.EndInit(); 

Image_Preview.Source = image; 

Oppure si caricare il BitmapImage direttamente da un flusso:

var image = new BitmapImage(); 

using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) 
{ 
    image.BeginInit(); 
    image.CacheOption = BitmapCacheOption.OnLoad; 
    image.StreamSource = stream; 
    image.EndInit(); 
} 

Image_Preview.Source = image; 
+0

Grazie, darò questo una prova :) –

+0

Quello ha funzionato perfettamente Userò 'FileStream' da ora in poi ogni volta che voglio evitare la memorizzazione nella cache. Grazie. –

+0

Ero alle prese con lo stesso problema. Grazie! – Misiu