WPF ListView性能非常慢 - 为什么?(ElementHost或其他原因?)

Tim*_*uri 22 wpf performance datagrid listview elementhost

我有一个Windows窗体应用程序,它有一个包含WPF UserControl的ElementHost ......在我的WPF中,我有一个非常简单的ListView:

<ListView Margin="4" ItemsSource="{Binding Notifications}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
            <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" />
            <GridViewColumn Header="City" DisplayMemberBinding="{Binding City}" />
            <GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" />
            <GridViewColumn Header="Zip" DisplayMemberBinding="{Binding Zip}" />
        </GridView>
    </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

如果我的源有10个项目,表单加载不到一秒钟.如果我的来源有1000个项目,则需要7秒!我的计时器只考虑加载(而不是获取物品所需的时间).

所以我的问题是:

使用ElementHost是一场表演噩梦吗?

WPF DataBinding是一场性能噩梦吗?

ListView是一块废话吗?(顺便说一句,与WPFToolkit的DataGrid相同的结果)?

小智 30

使用虚拟化

<ListView ItemsSource="{BindingNames}"Name="lv">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                   <!--<StackPanel/>
                    If StackPanel was used, the memory consumed was over 2GB and dead slow.
                    -->
                   <VirtualizingStackPanel>
                    <!--Memory footprint is only 200 mb-->
                    </VirtualizingStackPanel>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView> 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,VirtualizingStackPanels是ListViews的默认项面板模板.但是,使用分组等功能将覆盖默认值. (4认同)
  • 您还想确保 ScrollViewer.CanContentScroll 未设置为 false 否则这将禁用虚拟化(如 scobi 推断的) (2认同)

Taw*_*ani 12

您可能还想查看代码项目中的这篇优秀文章:

WPF:数据虚拟化作者:Paul McClean http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

它以最小的内存和带宽使用率向您展示了更好的方法.


Sim*_*der 6

我遇到过一个案例,这里提供的答案并没有解决我的问题。就我而言,将MaxHeight的 属性设置ListView为大于实际显示高度的值可以立即解决该问题,这要归功于此处的答案,即使我无法解释它的工作方式和原因。