2016-06-09 20 views
2

Ich zeige ein Bild in einer Xamarin.Forms UWP App, das Bild befindet sich im LocalState Ordner der App und die Bildquelle wird zur Laufzeit gesetzt.Xamarin.Forms UWP Bild schließt nie geöffnete Datei

Sobald das Bild angezeigt wird, wird die zugrunde liegende Datei geöffnet und kann daher nicht umbenannt werden z. der Windows-Explorer.

Aber auch wenn ich von der Seite mit dem Bild weg navigiere oder die Quelle des Bildes auf null oder ein anderes Bild setze, ist die Datei immer noch geöffnet und kann nicht umbenannt werden, bis ich die UWP-App schließe. Dieses Verhalten tritt bei Android oder iOS nicht auf.

Wie kann ich die vom Image angezeigte Datei freigeben?

XAML Tag für das Bild:

<Image x:Name="img"/> 

Einstellung des Image.Source:

string basePath = @"C:\Users\ss\AppData\Local\Packages\f736c883-f105-4d30-a719-4bf328872f5e_nh7s0b45jarrj\LocalState"; 
img.Source = ImageSource.FromFile(Path.Combine(basePath, "beleg.jpg")); 

Vielen Dank!

EDIT: Dies ist meine Arbeitslösung, dank der Hilfe von Clemens!

+0

Sie können wahrscheinlich auch '' durch erwarten CopyToAsync' CopyTo' ersetzen. – Clemens

Antwort

1

Dies sollte funktionieren (obwohl ich es nicht getestet):

var path = Path.Combine(basePath, "beleg.jpg"); 
var memoryStream = new MemoryStream(); 

using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) 
{ 
    fileStream.CopyTo(memoryStream); 
} 

memoryStream.Position = 0; 
img.Source = ImageSource.FromStream(() => memoryStream); 
+0

Vielen Dank, dieser Ansatz funktioniert wie ein Zauber! Ich öffnete die Datei mit der PCLStorage-Komponente und musste die Position des MemoryStream auf 0 setzen, aber jetzt funktioniert es gut! – stefffdev

0

Ich habe noch nie Xamarin verwendet, aber in fetten .Net, Bilder schließen Sie den Dateigriff nicht, bis entsorgt.

Vorausgesetzt, dass dies ähnlich ist, müssten Sie das Bild in einen "using" -Block laden, aber über die Clone-Methode einem anderen Bild zuweisen. Dies ist wahrscheinlich nicht zu kompilieren, aber Sie bekommen die Idee:

using (var loadimage = ImageSource.FromFile(...)) { 
    img.Source = loadimage.clone(); 
} 

Ich nehme an, dass dies vorübergehend doppelt so viele Bytes, die für eine einzelne Kopie erforderlich verwendet, aber zumindest die Datei-Handle geschlossen wird.

Wieder - basierend auf dem Wissen von System.Drawing, anstatt irgendetwas Xamarin, so nehmen Sie dies mit einer Prise Salz.

+0

Vielen Dank für Ihre Antwort, leider implementiert ImageSource IDisposable nicht und hat keine Klon-Methode in Xamarin. – stefffdev

Verwandte Themen