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