【问题标题】:WPF ListView Very Slow Performance - Why? (ElementHost, or Other Reason?)WPF ListView 性能非常慢 - 为什么? (ElementHost,还是其他原因?)
【发布时间】:2010-09-22 17:32:06
【问题描述】:

我有一个 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>

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

所以我的问题是:

使用 ElementHost 是一场噩梦吗?

WPF 数据绑定是一场性能噩梦吗?

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

【问题讨论】:

  • 所以我会用一个答案来问您的问题:您是否认为按照规定使用包含 1000 个项目的开箱即用的 WPF 列表视图应该消耗 2GB 内存并需要 7 秒才能加载?您认为这是代表 WPF 设计者的优秀软件工程的结果吗?

标签: wpf performance listview datagrid elementhost


【解决方案1】:

我有一个案例,这里提供的答案并没有解决我的问题。就我而言,将ListViewMaxHeight 属性设置为大于实际显示高度的值立即解决了它,这要感谢this answer here,即使我无法解释它是如何工作的以及为什么工作。

【讨论】:

  • MaxHeight 可以改变游戏规则 - 特别是对于拉伸父级控制权的 ListView,就像 DockPanel 中的最后一项一样。设置固定的 MaxHeight 可以使控制快速,在它无法使用之前。
【解决方案2】:

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

WPF:数据虚拟化 通过保罗麦克林 http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

它向您展示了一种以最少的内存和带宽使用更好的方法。

【讨论】:

    【解决方案3】:

    使用虚拟化

    <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> 
    

    【讨论】:

    • 这既令人惊奇又令人惊讶。无论如何,我自己是否可以获得与使用 GridView 而不是 DataTemplating 东西相同的外观/感觉?
    • 是的。只需将“”部分放入您的代码中。这是加快速度的部分。
    • 请注意,VirtualizingStackPanels 是 ListViews 的默认项目面板模板。但是,使用分组等一些功能会覆盖默认值。
    • 您还需要确保 ScrollViewer.CanContentScroll 未设置为 false,否则这将禁用虚拟化(由 scobi 推断)
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2019-05-31
    相关资源
    最近更新 更多