Xamarin.Forms UWP Image 从不关闭打开的文件

Xamarin.Forms UWP Image never closes opened File

我在 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);

我从未使用过 Xamarin,但在全功能 .Net 中,图像在处理前不会关闭文件句柄。

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

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

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

同样 - 基于 System.Drawing 的知识,而不是 Xamarin 的任何知识,所以对此持保留态度。

这应该有效(虽然我还没有测试过):

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);