25

私は、WPF UserControl を含む単一の ElementHost を持つ Windows フォーム アプリを持っています... 私の 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 個のアイテムがある場合、フォームは 1 秒未満で読み込まれます。ソースに 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

Code Project に関する次の優れた記事も参照してください。

WPF: Paul McClean によるデータ仮想化 http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

メモリと帯域幅の使用量を最小限に抑えた、はるかに優れたアプローチを示しています。

于 2009-04-07T15:15:23.807 に答える