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

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

私は、WPF UserControl を含む単一の ElementHost を持つ Windows Forms アプリを持っています... 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 データバインディングはパフォーマンスの悪夢ですか?

ListView はダメですか? (ちなみに、WPFToolkit の DataGrid でも同じ結果になります)?

ベストアンサー1

仮想化を使用する

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

おすすめ記事