Wpf 如何将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用作包含多个项目的视图,当然,我需要在其中使用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默认包含的内容相同。但虚拟化不起作用。我在这里读了几篇文章,也读了几条答案,但仍然不知道一般的方法-我必须设置、绑定、添加什么以及在哪里,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>