Рассматривая следующий пример файла XAML, который показывает первые 1000 человек Facebook, начиная с markz как 4-й человек. Обратите внимание, что это только образец. Любое окно с элементом 1000, независимо от того, как вы его построите, является хорошей демонстрацией.
<Window x:Class="SO.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:clr="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
И код позади:
public partial class MainWindow : Window
{
public MainWindow() {
InitializeComponent();
string[] urls = new string[1000];
for (int i = 0; i < 1000; ++i) {
urls[i] = "http://graph.facebook.com/" + i + "/picture";
}
this.DataContext = urls;
}
}
На очень разумном рабочем столе и высокой скорости соединения программа работает очень медленно. Попытка прокрутки с помощью полосы прокрутки ... скажем, в середине, займет 30 секунд. Нажатие клавиш «Домой» и «Конец» займет значительное время.
Это не проблема, возникающая при первом получении изображений в кеше. Переход назад и вперед и просмотр уже представленных изображений несколько быстрее, но обычно очень медленный. Похоже, что ничего не сохраняется в кеше, закрывая приложение и перезапуская его, все снова медленно.
Эквивалентный HTML-код быстро работает. Сначала немного медлительности, но потом все очень быстро.
Что происходит? Использует ли элемент какое-либо кэширование вообще? Делает ли список какую-либо предварительную выборку изображений, не представленных в настоящее время? Есть ли способ сказать это сделать? Действительно ли мое единственное решение - самостоятельно управлять растровыми объектами, а также логикой кэширования и предварительной выборки? Если да, то какую предыдущую работу я могу включить?
РЕДАКТИРОВАТЬ (резюме):
- @H.B. Ответ на отключение виртуализации даст вам лучший результат. Весь список выводится, как только загружается окно, и изображение не пересчитывается
- @ Код Фила отлично работает и повышает производительность, особенно при переходе назад и вперед.
- Без какого-либо дополнительного кода WPF не будет кэшировать изображения между вызовами. Кэш WinINET используется НЕ . Хотя запрос идет с инструкцией Cache в заголовке HTTP, WPF ничего не делает с ним.