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.