虚拟化ItemsControl?

虚拟化ItemsControl?

我有一个ItemsControl但是,它包含了我想要虚拟化的数据列表。VirtualizingStackPanel.IsVirtualizing="True"似乎不适用于ItemsControl.

这是真的吗?还是有其他我不知道的方法?

为了进行测试,我使用了以下代码块:

<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
              VirtualizingStackPanel.IsVirtualizing="True"><ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Initialized="TextBlock_Initialized"  
                   Margin="5,50,5,50" Text="{Binding Path=Name}" />
    </DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

如果我更改ItemsControl转到ListBox,我可以看到Initialized事件只运行几次(巨大的边距,所以我只需要看几个记录),但是作为一个ItemsControl每个项目都会被初始化。

我试过设置ItemsControlPanelTemplate转到VirtualizingStackPanel但这似乎没什么用。


qq_笑_17
浏览 683回答 3
3回答

守候你守候我

其实不仅仅是ItemsPanelTemplate使用VirtualizingStackPanel..默认ControlTemplate为ItemsControl没有ScrollViewer,这是虚拟化的关键。添加到默认控件模板中。ItemsControl(使用控件模板ListBox作为模板)给我们提供了以下内容:<ItemsControl     VirtualizingStackPanel.IsVirtualizing="True"     ScrollViewer.CanContentScroll="True"     ItemsSource="{Binding Path=AccountViews.Tables[0]}">     <ItemsControl.ItemTemplate>         <DataTemplate>             <TextBlock                 Initialized="TextBlock_Initialized"                 Text="{Binding Path=Name}" />         </DataTemplate>     </ItemsControl.ItemTemplate>     <ItemsControl.ItemsPanel>         <ItemsPanelTemplate>             <VirtualizingStackPanel />         </ItemsPanelTemplate>     </ItemsControl.ItemsPanel>     <ItemsControl.Template>         <ControlTemplate>         <Border             BorderThickness="{TemplateBinding Border.BorderThickness}"             Padding="{TemplateBinding Control.Padding}"             BorderBrush="{TemplateBinding Border.BorderBrush}"             Background="{TemplateBinding Panel.Background}"             SnapsToDevicePixels="True">                 <ScrollViewer                     Padding="{TemplateBinding Control.Padding}"                     Focusable="False">                     <ItemsPresenter                         SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />                 </ScrollViewer>             </Border>             </ControlTemplate>     </ItemsControl.Template></ItemsControl>

慕雪6442864

在DavidN的回答的基础上,您可以在ItemsControl上使用一种样式来虚拟化它:<!--Virtualised&nbsp;ItemsControl--><Style&nbsp;x:Key="ItemsControlVirtualizedStyle"&nbsp;TargetType="ItemsControl"> &nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="VirtualizingStackPanel.IsVirtualizing"&nbsp;Value="True"/> &nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="ScrollViewer.CanContentScroll"&nbsp;Value="True"/> &nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="ItemsPanel"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Setter.Value> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<VirtualizingStackPanel&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Setter.Value> &nbsp;&nbsp;&nbsp;&nbsp;</Setter> &nbsp;&nbsp;&nbsp;&nbsp;<Setter&nbsp;Property="Template"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Setter.Value> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ControlTemplate&nbsp;TargetType="ItemsControl"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Border &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BorderThickness="{TemplateBinding&nbsp;Border.BorderThickness}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Padding="{TemplateBinding&nbsp;Control.Padding}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BorderBrush="{TemplateBinding&nbsp;Border.BorderBrush}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Background="{TemplateBinding&nbsp;Panel.Background}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SnapsToDevicePixels="True" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ScrollViewer&nbsp;Padding="{TemplateBinding&nbsp;Control.Padding}"&nbsp;Focusable="False"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsPresenter&nbsp;SnapsToDevicePixels="{TemplateBinding&nbsp;UIElement.SnapsToDevicePixels}"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ScrollViewer> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Border> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ControlTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Setter.Value> &nbsp;&nbsp;&nbsp;&nbsp;</Setter></Style>我不喜欢使用ListBox的建议,因为它们允许选择不一定需要的行。

12345678_0001

只是默认的ItemsPanel不是VirtualizingStackPanel..你需要改变它:<ItemsControl> &nbsp;&nbsp;&nbsp;&nbsp;<ItemsControl.ItemsPanel> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<VirtualizingStackPanel&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;</ItemsControl.ItemsPanel></ItemsControl>
打开App,查看更多内容
随时随地看视频慕课网APP