为了账号安全,请及时绑定邮箱和手机立即绑定

虚拟化ItemsControl?

虚拟化ItemsControl?

qq_笑_17 2019-06-23 16:44:30
虚拟化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但这似乎没什么用。
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

其实不仅仅是ItemsPanelTemplate使用VirtualizingStackPanel..默认ControlTemplateItemsControl没有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>


查看完整回答
反对 回复 2019-06-23
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

在DavidN的回答的基础上,您可以在ItemsControl上使用一种样式来虚拟化它:

<!--Virtualised ItemsControl--><Style x:Key="ItemsControlVirtualizedStyle" TargetType="ItemsControl">
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ItemsControl">
                <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>
        </Setter.Value>
    </Setter></Style>

我不喜欢使用ListBox的建议,因为它们允许选择不一定需要的行。


查看完整回答
反对 回复 2019-06-23
?
12345678_0001

TA贡献1802条经验 获得超5个赞

只是默认的ItemsPanel不是VirtualizingStackPanel..你需要改变它:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel></ItemsControl>


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 682 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信