【发布时间】:2011-09-16 07:34:28
【问题描述】:
我有 1000 个来自 xml 的项目并将它们加载到一个 List 对象中。 List 数据绑定到 ListBox,它是水平方向的,因此用户可以从左到右或从右到左翻阅项目。由于项目数量很大,我的应用程序可能由于内存使用过多而退出。如果我将项目减少到 50 个,它会起作用。
然后是这篇关于数据虚拟化的文章
在实现了实现 IList 的虚拟化类之后,我看不出有什么不同。 this[](如下)仍然被调用了 1000 次,尽管我预计它只会被调用 30-40 次,因为我知道 UI 已经在 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>
【问题讨论】:
-
您应该发布列表框的 XAML - 根据您的描述,我怀疑您将 ItemsPanelTemplate 覆盖为水平方向的 StackPanel,因此列表确实不再虚拟化...
-
确实,我们需要 XAML,因为数据虚拟化和 UI 虚拟化是两个不同的主题,而这个问题显然是关于 UI 虚拟化的。
-
刚刚粘贴了 XAML,但由于某种原因,顶部标签
被切断了。基本上这部分
标签: windows-phone-7 listbox virtualization