Задача не обновляет интерфейс сразу - PullRequest
0 голосов
/ 13 февраля 2019

Я добавляю большой список изображений в элемент управления CoverView (созданный на основе списка). У меня проблема, когда информация слишком высокая.Добавленные изображения не будут отображаться одновременно. И мне нужно подождать, пока поиск и добавление завершатся. Я знаю, что для загрузки изображений потребовалось время.Я также пытался ускорить загрузку за счет уменьшения пикселей Но приложение зависает
Как я могу отображать изображения мгновенно, не вешая программу?
это моя модель представления

public class ImageData
    {
        public string Name { get; set; }
        public ImageSource ImageSource { get; set; }
    }
public async Task LoadFolder(CancellationToken ct)
        {
            foreach (var path in Directory.EnumerateFiles(DataPath, "*.jpg"))
            {
                if (!ct.IsCancellationRequested)
                {

                    Images.Add(new ImageData
                    {
                        Name = path,
                        ImageSource = await LoadImage(path)
                    });
                }

            }
        }

public Task<BitmapImage> LoadImage(string path)
        {
            return Task.Run(() =>
            {
                var bitmap = new BitmapImage();

                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    bitmap.BeginInit();
                    bitmap.DecodePixelHeight = 100;
                    bitmap.CacheOption = BitmapCacheOption.OnLoad;
                    bitmap.StreamSource = stream;
                    bitmap.EndInit();
                    bitmap.Freeze();
                }

                return bitmap;
            });
        }

и я называю это так

await ((ViewModel)DataContext).LoadFolder(ts.Token);

также я пытался IsAsync стало немного лучше, но программапродолжает висеть и поздно встает

<CoverView ItemsSource="{Binding Images, IsAsync=True}"/>

1 Ответ

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

ImageData должен реализовывать INotifyPropertyChanged и уведомлять об изменении свойства ImageSource, поскольку await предоставляет ему значение позже.IsAsync имеет значение, когда свойство bound извлекает данные синхронно и застревает в пользовательском интерфейсе при привязке.Кроме того, изображения должны иметь тип ObservableCollection, поскольку await позволяет добавлять элементы с задержкой.

...