web-dev-qa-db-ja.com

WPF ListViewのパフォーマンスが非常に遅い-なぜですか? (ElementHost、またはその他の理由?)

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と同じ結果)?

22
Timothy Khouri

仮想化を使用する

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

また、CodeProjectに関するこの優れた記事を確認することもできます。

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

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

12
Tawani

ここに提示された答えが私の問題を解決しなかった場合がありました。私の場合、MaxHeightListViewプロパティを実際に表示される高さよりも大きい値に設定すると、 この回答はここにあります のおかげで、すぐに解決しました。それがどのようにそしてなぜ働いたかを説明することはできません。

1