我在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);
答案 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的任何东西,所以用一点盐就可以了。