VirtualizingStackPanel不起作用

时间:2010-09-14 16:42:48

标签: wpf stackpanel virtualizingstackpanel

我有以下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,尽管这是一种虚拟模式。

我是否误解了虚拟化模式,或者我做错了什么?

1 个答案:

答案 0 :(得分:7)

不要将它放在ScrollViewer中。您粘贴的XAML确实绕过了虚拟化,但出于不同的原因:ListBox完全扩展(不滚动),因为scrollViewer允许它。因为它是完全“扩展”的,所以ListBox不使用虚拟化。如果将它放在常规容器中,它将使用其内置的滚动查看器 - Border,Grid等。