Xamarin.Forms UWP Image永远不会关闭打开的文件

时间:2016-06-09 08:38:29

标签: c# image xamarin uwp uwp-xaml

我在Xamarin.Forms UWP应用程序中显示图像,图像位于应用程序的LocalState文件夹中,图像源在运行时设置。

一旦显示图像,基础文件就会被打开,因此不能在例如图像中重命名。 Windows资源管理器。

但即使我离开显示图像的页面或将图像源设置为null或不同的图像,该文件仍然打开,并且无法重命名,直到我关闭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"));

谢谢!

修改 这是我的工作解决方案,感谢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);

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我从未使用过Xamarin,但在全脂.Net中,图像不会关闭文件句柄,直到处理完毕。

假设这是相似的,您必须在“使用”块中加载图像,但是通过克隆方法分配给另一个图像。这不太可能编译,但你会明白:

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

我认为这暂时使用的字节数是单个副本所需的两倍,但至少文件句柄会关闭。

再一次 - 基于System.Drawing的知识,而不是Xamarin的任何东西,所以用一点盐就可以了。