我有以下ListBox:
<ScrollViewer>
<!--Spec Definitions-->
<ListBox DataContext="{Binding SpecPackageSpecGroupListViewModel}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
ScrollViewer.IsDeferredScrollingEnabled="True"
ItemContainerStyle="{StaticResource SpecPackageSpecGroupListBoxStyle}"
ItemsSource="{Binding SortedChildren}"
Background="Transparent"
BorderThickness="0" SelectionMode="Extended"
Margin="5,5,5,5">
<ListBox.ItemTemplate>
<DataTemplate>
<Controls:SpecPackageSpecGroupControl/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>此列表框应该包含大约1000个项目,但很复杂。我想让它与VirtualizingStackPanel一起工作,所以我将可视化XAML配置设置为:
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling" 我的问题是,我认为它不工作-首先-它需要很长的时间来加载大约700项,其次,当我在我的控件构造函数上遇到断点时-我可以看到它被调用了700次:
public static int Counter = 0;
public SpecPackageSpecGroupControl()
{
InitializeComponent();
Counter++;
if (Counter%100 == 0)
Console.WriteLine("Hi");
}我在Console.WriteLine上设置了断点(“Hi”),我可以看到静态计数器达到了700。
因此,虽然这是一种虚拟模式,但基本上是在创建UIElements。
是我误解了虚拟化模式,还是我做错了什么?
发布于 2010-09-15 01:01:53
不要把它放在ScrollViewer中。您粘贴的XAML确实绕过了虚拟化,但原因不同: ListBox完全扩展(无需滚动),因为scrollViewer允许这样做。因为它是完全“扩展”的,所以ListBox不使用虚拟化。如果你把它放在一个常规的容器中--边框,网格等,它将使用内置的滚动查看器。
https://stackoverflow.com/questions/3710993
复制相似问题