我正在尝试将简单的WPF程序移植到UWP。它是用于将一些自定义图像分析例程应用于一堆图像的工具。
基本功能:
我遇到的问题是在图库中显示图像。
在WPF中,我可以像ListBox
般将ObservableCollection
绑定到InputImage
的{{1}}
<Image Source={Binding Image, IsAsync=True} />
UWP中的等效项是什么?
public class InputImage
{
public string Path { get; set; }
public BitmapImage Source
{
get
{
var image = new BitmapImage(new Uri(Path, UriKind.Absolute));
image.Freeze();
return image;
}
}
}
和IsAsync
部分),但是图像的宽度和高度均为0。Freeze
,打开它并设置位图源,但是我不能在属性getter中使用StorageFile
方法... 1> li>
有解决方案吗?
注意:我在appxmanifest中启用了broadFileSystemAccess”,并在设置->隐私->文件系统中为该应用打开了
答案 0 :(得分:2)
解决了,这是我学到的东西:
即使启用了broadFileSystemAccess
,似乎也必须通过StorageFile
访问外部文件。例如
StorageFile file = await StorageFile.GetFileFromPathAsync(@"C:\path\to\file");
您可以实例化BitmapImage
属性,并在首次加载图像列表时直接绑定到该属性,例如
BitmapImage image = new BitmapImage();
var storageFile = await StorageFile.GetFileFromPathAsync(path);
using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read))
{
await image.SetSourceAsync(stream);
}
InputImage.Source = image;
这对于单个图像来说很好,但是对于1000幅图像来说,这是一个问题-即使加载了GridView和其他控件的虚拟化效果,每个图像的加载也会占用大量的时间和内存。
解决方案是使用Stephen Cleary's blog中所述的异步绑定(是的,这似乎确实可行)。
程序:
安装Nito.AsyncEx
NuGet软件包。
对该属性使用以下内容:
public INotifyTaskCompletion<BitmapImage> ImageAsync
{
get { return NotifyTaskCompletion.Create(GetImageAsync()); }
}
public async Task<BitmapImage> GetImageAsync()
{
BitmapImage image = new BitmapImage();
var storageFile = await StorageFile.GetFileFromPathAsync(Path);
using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read))
{
await image.SetSourceAsync(stream);
}
return image;
}
然后根据此任务绑定图像,注意使用Binding
而不是x:Bind
:
<Image Source="{Binding ImageAsync.Result}"/>