Решено, вот что я узнал:
Даже при включенном 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;
Это хорошо для одного изображения, нос тысячами изображений существует проблема - каждое изображение загружается, занимая значительное время и память, даже с аспектами виртуализации GridView и других элементов управления.
Решением было использование асинхронной привязки (да, похоже, этона самом деле возможно) как описано в блоге Стивена Клири .
Процедура:
Установите пакет 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}"/>