WPF ListView performances très lentes-pourquoi? (ElementHost, ou une autre raison?)

J'ai une application Windows Forms, qui a un seul ElementHost contenant un UserControl WPF... dans mon WPF, j'ai un ListView très simple:

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

Si ma source contient 10 éléments, le formulaire se charge en moins d'une seconde. Si ma source contient 1000 éléments, cela prend 7 secondes!!! Ma minuterie ne prend en compte que le chargement (pas combien de temps il faut pour obtenir les éléments).

Donc ma question Est:

L'utilisation D'un ElementHost est-elle un cauchemar de performance?

Est la liaison de données WPF a cauchemar de performance?

Le ListView est-il une merde? (btw, mêmes résultats avec le DataGrid de WPFToolkit)?

21
demandé sur Timothy Khouri 2008-11-17 22:09:35

2 réponses

Utiliser la virtualisation

<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> 
26
répondu 2008-11-17 19:33:07

Vous pouvez également vérifier cet excellent article sur le projet de Code:

WPF: virtualisation des données Par Paul McClean http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

Il vous montre une bien meilleure approche à une utilisation minimale de la mémoire et de la bande passante.

11
répondu Tawani 2009-04-07 15:15:23