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