WPF Datagrid Performance
Je suis en train de travailler avec WPF Toolkit grille de données et il est de défilement extrêmement lent pour le moment. Le réseau a 84 colonnes et 805 lignes. (Y compris les 3 colonnes fixes et de l'en-tête est fixe.) Le défilement à la fois horizontalement et verticalement, est extrêmement lente. La virtualisation est activée et j'ai activé la colonne de la virtualisation et de la ligne de virtualisation explicitement dans le code xaml. Est-il quelque chose à regarder qui peut vraiment effet de la performance, tels que les méthodes de reliure, ou ce que xaml est dans chaque celltemplate?
Une chose à noter est que je suis l'ajout dynamique de colonnes sur la création de la grille de données. Peut-être effectuer quoi que ce soit? (J'ai aussi créer dynamiquement le celltemplate dans le même temps, de sorte que mes liaisons sont définies à droite.)
Ci-dessous est le code à partir du modèle pour la plupart des cellules qui se produit. Essentiellement pour les colonnes-je besoin d'ajouter dynamiquement (qui est la plupart d'entre eux), je boucle ma liste et ajouter des colonnes à l'aide de la méthode AddColumn, en plus je générer dynamiquement le modèle afin que la liaison états correctement l'index de l'élément de droite dans la collection de cette colonne. Le modèle n'est pas trop complexe, juste deux TextBlocks, mais je ne lient quatre propriétés différentes sur chacun d'eux. Il semble que j'ai été capable de faire sortir un peu plus de performance par des changements les liaisons à OneWay:
private void AddColumn(string s, int index)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = s;
//Set template for inner cell's two rectangles
column.CellTemplate = CreateFactViewModelTemplate(index);
//Set Style for header, ie rotate 90 degrees
column.HeaderStyle = (Style)dgMatrix.Resources["HeaderRotateStyle"];
column.Width = DataGridLength.Auto;
dgMatrix.Columns.Add(column);
}
//this method builds the template for each column in order to properly bind the rectangles to their color
private static DataTemplate CreateFactViewModelTemplate(int index)
{
string xamlTemplateFormat =
@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column=""0"" MinHeight=""10"" MinWidth=""10"" HorizontalAlignment=""Stretch"" Padding=""3 1 3 1"" TextAlignment=""Center"" Foreground=""{Binding Path=FactViewModels[~Index~].LeftForeColor,Mode=OneWay}"" Background=""{Binding Path=FactViewModels[~Index~].LeftColor,Mode=OneWay}"" Text=""{Binding Path=FactViewModels[~Index~].LeftScore,Mode=OneWay}"" />
<TextBlock Grid.Column=""1"" MinHeight=""10"" MinWidth=""10"" HorizontalAlignment=""Stretch"" Padding=""3 1 3 1"" TextAlignment=""Center"" Foreground=""{Binding Path=FactViewModels[~Index~].RightForeColor,Mode=OneWay}"" Background=""{Binding Path=FactViewModels[~Index~].RightColor,Mode=OneWay}"" Text=""{Binding Path=FactViewModels[~Index~].RightScore,Mode=OneWay}"" />
</Grid>
</DataTemplate>";
string xamlTemplate = xamlTemplateFormat.Replace("~Index~", index.ToString());
return (DataTemplate)XamlReader.Parse(xamlTemplate);
}
- Oui, Microsoft Excel est environ 100 fois plus rapide que même les plus rapides commercial WPF contrôles de grille de données. Datagrids vraiment mettre en évidence les faiblesses de WPF.
- Le 15 yr old Delphi datagrid s'exécute plus rapidement sur 15 yr vieux matériel.
Vous devez vous connecter pour publier un commentaire.
Puisque je ne peux pas voir le code source, il est assez difficile de vous aider. Surtout depuis que la performance d'une application WPF est influencé par beaucoup de choses. Pour d'autres conseils sur ce à regarder dehors pour voir L'optimisation des Performances des Applications WPF. Et oui il est toujours beaucoup plus de questions que xaml est utilisé dans chaque cellule. Parce que généralement les problèmes de performance ne se résument à "trop d'éléments". Saviez-vous que la zone de texte sont je pense de 30 éléments individuels? Je vous recommande d'utiliser le La Performance des Outils de Profilage pour WPF pour en savoir plus au sujet de votre problème spécifique. Essayez de réduire la quantité d'éléments que vous utilisez (par exemple, en passant de la zone de texte à TextBlock le cas échéant).
Aussi, vous avez pour vérifier si les problèmes de performance existent sur n'importe quel PC vous essayez de l'application. Peut-être que l'ordinateur que vous utilisez est de forcer WPF en fonction des logiciels de rendu. Ou êtes-vous à l'aide de tout BitmapEffects?
Edit:
En regardant ton code, je vous suggère de changer
column.Width = DataGridLength.Auto;
raisonnable de largeur fixe, depuis la grille de ne pas avoir à recalculer la largeur dynamiquement chaque fois que quelque chose change (comme l'ajout de lignes, ou même de défilement).
Une pointe générale pour DataGrid des problèmes de performances: j'ai eu un problème avec le composant DataGrid qui l'a littéralement secondes pour se rafraîchir après une fenêtre de redimensionnement, de tri des colonnes, etc. et verrouillé en haut de la fenêtre de l'INTERFACE utilisateur alors qu'il était de le faire (1000 lignes, 5 colonnes).
Il est descendu à un problème (bug?) avec WPF calculs de dimensionnement. Je l'ai eu dans une grille avec les RowDefinition Height="Auto" qui est à l'origine du système de rendu d'essayer et de recalculer la taille de la grille de données au moment de l'exécution par la mesure de la taille de chaque colonne et de la ligne, sans doute par remplir toute la grille (comme je le comprends). Il est censé s'occuper de ce de manière intelligente en quelque sorte, mais dans ce cas, il ne l'était pas.
Une vérification rapide pour voir si c'est un problème connexe est de définir la Hauteur et la Largeur des propriétés de la grille de données de taille fixe pour la durée de l'essai, et essayez d'exécuter à nouveau. Si votre performance est restauré, un correctif permanent peut être parmi ces options:
valeurs fixes
qu'il pourrait obtenir en utilisation normale
dans un de mes projets de la grille suivante paramètre de style était à l'origine un important problème de performance:
Quand j'ai enlevé le ScrollViewer.CanContentScroll paramètre, le problème a disparu.
Avez-vous, par hasard, une tablette de toute sorte installé (via USB ou un tablet PC)?
J'ai trouvé une performance bug dans le WPF grille de données lors de l'utilisation d'une tablette. J'ai posté une vidéo et il est reconnu par MS ici, dans ce fil
Cheers,
Jon
J'ai eu un cas où mon objet sous-jacent avait une propriété avec setter seulement. La même propriété est accessible par la mise en œuvre de ITypedList dans la collecte et la via TypeDescriptionProvider/ICustomTypeDescriptor sur les objets individuels. Soit en retirant le de la propriété ou de l'ajout d'un getter résolu les problèmes de performances.
Une chose que je suggère dans de tels scénarios est de regarder comment vous avez appliqué le style et ce style est à chaque cellule.
Le style appliqué que s'il a un complexe Visuelle de l'Arbre tend à dégrader les performances.
Vous pouvez également essayer les Différés option de Défilement sur la dernière WPF Datagrid.