2015-02-05 55 views
1

我想使用ListBox作为包含多个项目的视图,当然,我需要在其中使用UI虚拟化。如何使用UI虚拟化与重新定义的列表框模板

问题是,当我宣布的ListBox这样的虚拟化只适用:

​​

但是,如果我尝试定制它,它不会再虚拟化:

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Recycling"> 

    <ListBox.Template> 
     <ControlTemplate> 
      <ScrollViewer> 
       <ItemsPresenter /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ListBox.Template> 

    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <views:SiteEntryView /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

至于我我们发现,这个示例包含了与ListBox默认包含的相同的内容。但是虚拟化不起作用。我已经阅读了几篇文章,还有几条答案,但还是无法弄清楚“一般方法” - 我必须设置,绑定,添加等什么以及在哪里进行虚拟化,以便使用自定义模板工作?

回答

2

原因是,您正在使用StackPanel您的ItemsPanel - 您应该使用VirtualizingStackPanel而不是(这也是ListBox的默认ItemsPanel)。

要么删除您ItemsPanel定义或修改它使用VirtualizingStackPanel

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
+0

我肯定都尝试,但现在我又试了一次,它的工作原理。 :\我不知道以前有什么错。 – yaapelsinko 2015-02-05 23:05:59

1

两件事情:

更新您的PanelTemplate使用VirtualizingStackPanel并添加virtualization选项来ControlTemplateScrollViewer

<ListBox.Template> 
    <ControlTemplate> 
     <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling"> 
      <ItemsPresenter /> 
     </ScrollViewer> 
    </ControlTemplate> 
</ListBox.Template> 

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <views:SiteEntryView /> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

+0

我看到属性可以在ListBox或ScrollViewer上运行。它是否意味着属性可以设置在可视树的某个根上(我的意思是某个元素对其子树显示为根),还是它是一些WPF的“自动化”的东西? – yaapelsinko 2015-02-05 23:25:57

+0

我在过去遇到过很多问题(有很多实时数据),当在根列表框节点上提供这些属性时,这些属性无法正常工作。我忘了在哪里,但我遇到了一篇博客文章,声称它应该在ControlTemplate本身中设置;自那时以来,virutalizon一直工作得更好。 – 2015-02-05 23:36:55