2011-04-29 82 views
2

我在这里遇到问题,我想在TreeView中显示一些项目,大约100.000个元素。 如果我使用默认的WPF TreeView似乎一切正常,但如果我使用自定义TreeView(这是目前只有一个ItemsControl),虚拟化似乎不再工作。 虽然研究在网上,我已经尝试了一些解决方案,但没有人似乎工作... 这里是我的XAML:Treeview上的VirtualizingStackPanel不是虚拟化的

<Style TargetType="{x:Type my:MultiSelectionTreeView}"> 
    <Setter Property="TreeView.Background" Value="Transparent"/> 
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/> 
    <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/> 
    <Setter Property="TreeView.OverridesDefaultStyle" Value="True" /> 
    <Setter Property="ItemsControl.ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel IsItemsHost="True"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="TreeView.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type my:MultiSelectionTreeView}"> 
       <Border Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"> 
        <ScrollViewer Focusable="True" CanContentScroll="true" 
            Padding="4" 
            VerticalScrollBarVisibility="Auto"> 
         <ItemsPresenter HorizontalAlignment="Stretch"/> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

的项目是在数据绑定一个ObservableCollection,所以应该不会问题......但它是什么?

映入眼帘,

于尔根

回答

2

的VirtualizingStackPanel有一些特殊的代码,以查找TreeView和树型视图。另外,TreeViewItem实现VirtualizingStackPanel.IProvideStackingSize,这是一个你不能实现的内部接口。因此,如果您尝试复制TreeView中的项目的层次结构,那么您必须从TreeView派生出使用虚拟化(而不是ItemsControl)。

+0

grmph,一切都是可能的,但如果你看起来够深,那么就会有如此多的不便和限制......哦,那就这样吧。谢谢! – opiswahn 2011-05-06 08:15:41