WPF: Как загрузить много больших изображений быстро в wrappanel?

У меня есть приблизительно 45 прилично больших изображений (о 680x1000), который должен быть загружен в простой пользовательский элемент управления (округлил backborder с заливкой, изображением, textblock, и 2 прямоугольниками стороны), и затем отобразился в wrappanel. Виртуализация действительно не поможет здесь, так как изображения должны быть все видимы при загрузке программы.

Я знаю в BitmapImage init, я могу установить decodepixel ширину, которая действительно помогает немногому, однако я хотел бы загрузить их всех как полный размер, так как я хочу смочь, изменяют размер изображений с ползунком, не теряя качество (эта часть работает быстро по большей части). Я знаю, что одна возможность состояла бы в том, чтобы установить decodewidth, чтобы быть некоторым номером, который я определил, поскольку макс. видимый размер мог помочь.

Я попробовал многопоточный подход, найденный в том, Как я загружаю изображения в фоновом режиме? (первый ответ), однако это заставило программу брать НАМНОГО дольше для загрузки!

Какие-либо идеи?

Текущий код загрузки:

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
//bmp.DecodePixelWidth = 400;
bmp.UriSource = new Uri(file.FullName);
bmp.EndInit();
bmp.Freeze();
images.Add(bmp);

Демонстрационный код XAML:

        
    
        
            
            
        
        
            
            
        
        
        
        
        
   

.

ОБНОВЛЕНИЕ:

Хорошо я закончил тем, что делал это более быстро реагирующим путем выполнения цикла изображения загрузки в единственном второстепенном рабочем. После того, как каждое изображение загружается, Dispacher. Вызовите назван для создания объекта переноса. После проигрывания с ним некоторое время я заставил его показывать каждый объект, поскольку это создается в то же время, которое потребовалось прежде.

6
задан Community 23 May 2017 в 12:19
поделиться

1 ответ

Если вас устраивает общая производительность, только загрузка изображений, вы можете попробовать это руководство по многопоточному пользовательскому интерфейсу. Мне удалось заставить его работать довольно легко, но если вы загружаете все изображения в цикле, он не обновит визуализацию, пока вы не завершите загрузку всех изображений. Однако пользовательский интерфейс в это время реагирует, так как вся загрузка выполняется в отдельном потоке.

В качестве альтернативы, если вы загружаете все изображения в цикле, вы можете попробовать улучшенную версию метода Windows Forms DoEvents (прокрутите вниз до примера). Вы вызываете это после загрузки каждого изображения, и это даст возможность пользовательскому интерфейсу обновиться (обработать взаимодействие с пользователем и т. Д.). Это подход, который я использовал при загрузке фрагментов карты для своего проекта, и он проще, чем первый.

1
ответ дан 17 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: