У меня было 1000 элементов из xml и я загрузил их в объект List. Список привязан к ListBox, который горизонтально ориентирован, поэтому пользователь может пролистывать элементы слева направо или справа налево. Поскольку количество элементов огромно, мое приложение закрывалось, вероятно, из-за чрезмерного использования памяти. Если бы я уменьшил количество предметов до 50, это сработало.
Я нашел эту статью
http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight-for-Windows-Phone-7-Data-Virtualization.aspx
, а затем эта статья о виртуализации данных
http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx
После реализации виртуализированного класса, реализующего IList, я не вижу разницы. This [] (ниже) вызывается еще 1000 раз, хотя я ожидал, что он будет вызываться только 30-40 раз, поскольку я понимаю, что пользовательский интерфейс уже виртуализирован в Listbox. Почему не работает виртуализация?
object IList.this[int index]
{
get
{
if (index >= cachedItems.Count)
{
//replenish cache code here
}
return cachedItems[index];
}
set
{
throw new NotImplementedException();
}
}
Вот часть XAML, относящаяся к проблеме. Надеюсь, что это дает полную картину кода. Не уверен, что Width=Auto
имеет какое-либо отношение к этому, но я не могу изменить его, иначе мое перелистывание прекращается.
<ScrollViewer HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" Width="auto" x:Name="WordsScrollview" Opacity="1" Grid.Row="1" RenderTransformOrigin="0.5,0.5">
<ListBox x:Name="horizontalListBox" Width="auto" Height="Auto" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal">
</StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Width="430" Text="{Binding Word}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" TextAlignment="Center" />
<Image Height="290" HorizontalAlignment="Center" Name="image1" Stretch="Fill" Width="430" Source="{Binding ImageFile}" Margin="10,50,10,0" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Background>
<SolidColorBrush />
</ListBox.Background>
</ListBox>
</ScrollViewer>