Wpf 如何将UI虚拟化与重新定义的ListBox模板一起使用
我试图将ListBox用作包含多个项目的视图,当然,我需要在其中使用UI虚拟化 问题是,只有当我这样声明ListBox时,虚拟化才起作用:Wpf 如何将UI虚拟化与重新定义的ListBox模板一起使用,wpf,xaml,listbox,virtualization,ui-virtualization,Wpf,Xaml,Listbox,Virtualization,Ui Virtualization,我试图将ListBox用作包含多个项目的视图,当然,我需要在其中使用UI虚拟化 问题是,只有当我这样声明ListBox时,虚拟化才起作用: <ListBox ItemsSource="{Binding ItemsSource}" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> <ListBo
<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默认包含的内容相同。但虚拟化不起作用。我在这里读了几篇文章,也读了几条答案,但仍然不知道一般的方法-我必须设置、绑定、添加什么以及在哪里,etc使虚拟化与自定义模板一起工作?原因是您正在为ItemsPanel使用StackPanel-您应该改为使用VirtualzingStackPanel,这也是ListBox的默认ItemsPanel 删除ItemsPanel定义或将其修改为使用VirtualzingStackPanel:
原因是您正在为ItemsPanel使用StackPanel—您应该使用VirtualzingStackPanel,这也是ListBox的默认ItemsPanel 删除ItemsPanel定义或将其修改为使用VirtualzingStackPanel: 两件事: 更新PanelTemplate以使用VirtualzingStackPanel,并将虚拟化选项添加到ControlTemplate的ScrollViewer中 两件事: 更新PanelTemplate以使用VirtualzingStackPanel,并将虚拟化选项添加到ControlTemplate的ScrollViewer中
我肯定两个都试过了,但现在我又试了一次,效果很好我想知道以前出了什么问题。我肯定两个都试过了,但现在我又试了一次,效果很好我想知道以前出了什么问题。我看到属性在ListBox或ScrollViewer上工作。这是否意味着可以在可视化树的某个根上设置属性?我指的是出现在其子树的某个根上的元素,还是WPF的一些自动功能?我过去遇到过很多实时数据的问题,这些属性在根ListBox节点上提供时无法正常工作。我忘了在哪里了,但我看到一篇博文,上面说应该在ControlTemplate本身中设置它;从那以后,virutalizaiton一直工作得更好。我看到属性可以在ListBox或ScrollViewer上工作。这是否意味着可以在可视化树的某个根上设置属性?我指的是出现在其子树的某个根上的元素,还是WPF的一些自动功能?我过去遇到过很多实时数据的问题,这些属性在根ListBox节点上提供时无法正常工作。我忘了在哪里了,但我看到一篇博文,上面说应该在ControlTemplate本身中设置它;从那以后,virutalizaiton的工作就更好了。我应该使用on-of来创建虚拟化的滚动条吗?我应该使用on-of来创建虚拟化的滚动条吗?
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<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>