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

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

只要显示图像,底层文件就会打开,因此不能在Windows资源管理器中重命名。

但即使当我离开显示图像的页面时,或者将图像的源设置为null或不同的图像时,该文件仍然会打开并且无法重命名,直到关闭UWP应用程序。 Android或iOS上不会发生此行为。

如何释放图像显示的文件?

图像的XAML标签:

<Image x:Name="img"/>

设置Image.Source:

string basePath = @"C:UsersssAppDataLocalPackagesf736c883-f105-4d30-a719-4bf328872f5e_nh7s0b45jarrjLocalState";
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);

这应该工作(虽然我没有测试过):

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

我从来没有使用过Xamarin,但是在全脂肪.Net中,图像在处置之前不会关闭文件句柄。

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

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

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

再次 - 基于System.Drawing的知识,而不是任何Xamarin,所以拿一点盐。

链接地址: http://www.djcxy.com/p/40555.html

上一篇: Xamarin.Forms UWP Image never closes opened File

下一篇: Merging XPS files leaves open file handles to document references