Je travaille avec la grille de données WPF Toolkit et le défilement est extrêmement lent en ce moment. La grille comporte 84 colonnes et 805 lignes. (Y compris 3 colonnes fixes et l'en-tête est fixe.) Le défilement horizontal et vertical est extrêmement lent. La virtualisation est activée et j'ai activé la virtualisation des colonnes et des lignes de manière explicite dans le xaml. Y a-t-il quelque chose à surveiller qui puisse vraiment affecter les performances, comme les méthodes de liaison, ou le xaml qui se trouve dans chaque modèle de cellule ?
Il convient de noter que j'ajoute dynamiquement les colonnes lors de la création de la grille de données. Cela peut-il avoir un effet ? (Je crée aussi dynamiquement le modèle de cellule en même temps pour que mes liaisons soient bien définies).
Vous trouverez ci-dessous le code du modèle pour la plupart des cellules qui sont générées. Pour les colonnes que je dois ajouter dynamiquement (c'est-à-dire la plupart d'entre elles), je boucle dans ma liste et j'ajoute les colonnes à l'aide de la méthode AddColumn, puis je construis dynamiquement le modèle pour que les instructions de liaison indexent correctement le bon élément de la collection pour cette colonne. Le modèle n'est pas trop complexe, juste deux TextBlocks, mais je lie quatre propriétés différentes sur chacun. Il semble que j'ai pu obtenir un peu plus de performances en modifiant les liaisons avec 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);
}