2010-09-14 73 views
1

我有以下列表框:VirtualizingStackPanel不工作

<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命令(“你好”),我可以看到,静态计数器达到了700.

所以基本上UIElem虽然这是一种虚拟模式,但它们正在创建。

我误解了虚拟化模式,还是有什么我做错了?

回答

3

不要把它放在ScrollViewer中。粘贴的XAML确实绕过虚拟化,但出于不同的原因:由于scrollViewer允许,ListBox完全扩展(不滚动)。由于它完全“扩展”,ListBox不使用虚拟化。它将使用其内置的滚动查看器,如果你把它放在一个普通的容器 - 边界,网格等。

+0

你救了我的一天! – alizx 2015-01-04 09:02:43