Учитывая следующий образец файла XAML, в котором показаны первые 1000 человек Facebook, начиная с markz как 4-й человек. Обратите внимание, что это всего лишь образец. Любое Окно с элементом 1000, независимо от того, как вы его построите, является хорошей демонстрацией.Почему <Image Source = '...'> настолько медленный, и что я могу с ним поделать?
<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;
}
}
На очень разумный рабочий стол и высокую скорость соединения, программа крайне медленно. Попытка прокрутки с помощью ScrollBar ... скажем, посередине, займет 30 секунд. Нажатие клавиш «Home» и «End» займет много времени.
Это не проблема, связанная с первым обращением к изображениям. Переход туда и обратно и просмотр уже представленных изображений происходит несколько быстрее, но в целом очень медленно. Похоже, что ничего не хранится в кеше, закрывая приложение и перезагружая его, все происходит медленно.
Эквивалентный HTML-код быстро блестит. Некоторая медлительность в первый раз, но потом все очень быстро.
Что происходит? Использует ли элемент какое-либо кеширование вообще? Отображает ли список предварительный выбор изображений, которые в настоящее время не представлены? Есть ли вообще сказать, что нужно делать? Действительно ли это единственное решение для управления объектами Bitmap, а также кэширование и предварительная выборка логики? Если да, то любая предыдущая работа, которую я могу включить?
EDIT (резюме):
- @ H.B. ответ для отключения виртуализации даст вам лучший результат. Весь список отображается, как только загружается окно, и никакое изображение не пересчитывается.
- Код @Phil отлично работает, и это улучшает производительность, особенно при движении назад и вперед.
- Без какого-либо дополнительного кода WPF не будет кэшировать изображения между вызовами. Кэш WinINET: НЕ используется. Хотя запрос поставляется с инструкцией Cache в заголовке HTTP, WPF ничего не делает с ним.
Спасибо H.B. +1 и принять. – Uri