2016-06-09 2 views
2

Я показываю изображение в приложении Xamarin.Forms UWP, изображение находится в папке LocalState приложения, а источник изображения устанавливается во время выполнения.Xamarin.Forms UWP Изображение никогда не закрывается открыто Файл

Как только изображение отображается, основной файл открывается и поэтому не может быть переименован, например. Проводник Windows.

Но даже когда я перемещаюсь от страницы, отображающей изображение, или задаю источник изображения нулевым или другим изображением, файл все еще открыт и не может быть переименован до закрытия приложения UWP. Такое поведение не наблюдается на Android или iOS.

Как я могу отпустить файл, отображаемый изображением?

XAML Тэг для изображения:

<Image x:Name="img"/> 

Установка 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")); 

Спасибо!

EDIT: Это мое рабочее решение, благодаря помощи Clemens!

IFolder localStorage = FileSystem.Current.LocalStorage; 
IFile sourceFile = await localStorage.GetFileAsync("beleg.jpg"); 

var memoryStream = new MemoryStream(); 
using (var fileStream = await sourceFile.OpenAsync(FileAccess.Read)) 
{ 
    await fileStream.CopyToAsync(memoryStream); 
} 

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

Вы, вероятно, может также заменить '' CopyTo' по CopyToAsync' ждут. – Clemens

ответ

1

Это должно работать (хотя я не проверял):

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

Спасибо, этот подход работает как шарм! Я открыл файл с помощью компонента PCLStorage и должен был установить положение MemoryStream на 0, но теперь он работает нормально! – stefffdev

0

Я никогда не использовал Xamarin, но в полном жире .Net изображения не закрывают дескриптор файла до тех пор, пока не будут удалены.

Предполагая, что это похоже, вам нужно загрузить изображение в блок «using», но назначить другому изображению с помощью метода Clone. Это, вероятно, не компилируется, но вы получите идею:

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

Я предполагаю, что это временно использует в два раза больше байт, как те, которые требуются для одной копии, но, по крайней мере, дескриптор файла закрывается.

Снова - основанный на знании System.Drawing, а не что-нибудь Xamarin, так что возьмите это с щепоткой соли.

+0

Благодарим за отзыв, к сожалению, ImageSource не реализует IDisposable и не имеет метода клонирования в Xamarin. – stefffdev

Смежные вопросы