25

我有一个 Windows 窗体应用程序,它有一个包含 WPF 用户控件的 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 DataBinding 是性能噩梦吗?

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

4

3 回答 3

31

使用虚拟化

<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> 
于 2008-11-17T19:33:07.707 回答
12

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

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

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

于 2009-04-07T15:15:23.807 回答
3

我有一个案例,这里提供的答案并没有解决我的问题。在我的情况下,将 的MaxHeight属性设置为ListView大于实际显示高度的值立即解决了它,这要归功于这里的答案,即使我无法解释它是如何工作的以及为什么工作。

于 2019-01-16T08:10:48.190 回答