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)?
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>
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.