我正在尝试将ListBox用作包含多个项目的视图,当然,我需要在其中使用UI虚拟化。
问题是虚拟化仅在我以这种方式声明ListBox时才起作用:
<ListBox
ItemsSource="{Binding ItemsSource}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListBox.ItemTemplate>
<DataTemplate>
<views:SiteEntryView />
</DataTemplate>
</ListBox.ItemTemplate>
</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包含的内容。但虚拟化并不起作用。我在这里阅读了几篇文章和几个答案,但仍然无法弄清楚“一般方式” - 我必须设置,绑定,添加等的内容和位置,以使虚拟化与自定义模板一起工作?
答案 0 :(得分:2)
原因是您为StackPanel
使用ItemsPanel
- 您应该使用VirtualizingStackPanel
代替(这也是ListBox的默认ItemsPanel)。
删除ItemsPanel
定义或修改它以使用VirtualizingStackPanel
:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
答案 1 :(得分:2)
两件事:
更新您的PanelTemplate
以使用VirtualizingStackPanel
并将virtualization
个选项添加到ScrollViewer
的{{1}}。
ControlTemplate