为什么我的WPF ListView/GridView没有虚拟化?

4

我在使用列表视图/网格视图时遇到了性能问题。

我追踪发现视图没有被虚拟化。我移除了所有关键业务代码,只剩下以下XAML。

<UserControl  x:Class="Weingartner.Controls.PointListEditorView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
              x:Name="Root">

    <Grid>
        <ListView ItemsSource="{Binding ElementName=Root, Path=Points, Mode=OneWay}">
                <ListView.View>
                    <GridView  >
                         <GridViewColumn>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Label>Foo</Label>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                     </GridView>
                </ListView.View>

            </ListView>
    </Grid>
</UserControl >

当我查看可视化调试器时,我看到了这个。

debugger screen shot

ListViewItem实例覆盖整个数据列表,大约有800个点。
当我打开任何ListViewItem对象时,我可以看到它们完全填充如下。

enter image description here

据我所知,文档中说ListBox和ListView默认开启虚拟化。这是正确的吗?
有什么建议吗?
编辑:这是完整可视树的屏幕截图:enter image description here

你的用户控件上面有什么内容?里面可能包含了ScrollViewer吗? - Eli Arbel
UserControl位于TabControl中,而TabControl本身位于DockPanel中。 - JK82
上面的代码进行了虚拟化,因此问题可能出现在它外部的环境中。或者你正在使用低于4.0版本的WPF? - Eli Arbel
如果您指定 <ListView VirtualizingStackPanel.IsVirtualizing="True">,它是否有效? - Eli Arbel
你应该包含从窗口到列表视图的整个可视树的屏幕截图。 - Eli Arbel
显示剩余2条评论
1个回答

3
我们正在使用MahApps.Metro,在将默认的ListView样式设置为VirtualisedMetroListView后,列表的虚拟化工作正常: <Style BasedOn="{StaticResource VirtualisedMetroListView}" TargetType="ListView" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接