UWP отображает изображение с внешнего пути? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь портировать простую программу WPF на UWP.Это инструмент для применения некоторых пользовательских процедур анализа изображений к куче изображений.

Основные функции:

  1. Добавление изображений в представление галереи (может быть 100 000 изображений)
  2. Запуск анализа изображений
  3. Экспорт данных

У меня проблема с отображением изображений в галерее.

В WPF я мог бы сделатьListBox привязан к ObservableCollection из InputImage как <Image Source={Binding Image, IsAsync=True} />

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;
        }
    }
}

Что такое эквивалент в UWP?

  • Я пробовал вышеизложенное (за исключением IsAsync и Freeze частей), но изображение имеет ширину и высоту 0.
  • Я подумал, что, возможно, мне придется создатьStorageFile из пути, откройте его и установите источник растрового изображения, но я не могу использовать async методы внутри свойства getter ...

Какие-либо решения?

Примечание: у меня есть broadFileSystemAccess ", включенный в appxmanifest и включенный для приложения в Настройки -> Конфиденциальность -> Файловая система

1 Ответ

0 голосов
/ 20 февраля 2019

Решено, вот что я узнал:

Даже при включенном 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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...