2009-09-28 20 views
1

Pour un projet personnel, j'ai besoin de remplir dynamiquement une grille, basée sur le contenu d'un tableau de taille variable. J'utilise le code suivant les lignes de ce qui est ci-dessous pour faire cela, et cela fonctionne bien, sauf que lorsque le tableau devient grand (comme dans 200 x 200 ou plus), il devient lent (plus de 20 secondes pour peupler). Il semble que l'instanciation des boutons soit rapide, mais l'ajout à la grille est lent.
Est-ce que je fais quelque chose de mal? Y a-t-il quelque chose que je puisse faire pour accélérer le processus en utilisant la grille régulière de WPF? Dois-je regarder un autre contrôle? Merci d'avance pour toute suggestion.Comment puis-je accélérer l'ajout de contrôles à une grille WPF?

 int columns=200; 
     int rows=200; 

     var width = new GridLength(30); 
     var height = new GridLength(25); 

     for (int column = 0; column < columns; column++) 
     { 
      var columnDefinition = new ColumnDefinition(); 
      columnDefinition.Width = width; 
      this.TestGrid.ColumnDefinitions.Add(columnDefinition); 
     } 

     for (int row = 0; row < rows; row++) 
     { 
      var rowDefinition = new RowDefinition(); 
      rowDefinition.Height = height; 
      this.TestGrid.RowDefinitions.Add(rowDefinition); 
     } 

     for (int column = 0; column < columns; column++) 
     { 
      for (int row = 0; row < rows; row++) 
      { 
       var button = new Button(); 
       button.Content = row.ToString() + ", " + column.ToString(); 
       Grid.SetRow(button, row); 
       Grid.SetColumn(button, column); 
       this.TestGrid.Children.Add(button); 
      } 
     } 

Répondre

1

Il est vrai que je reçois toujours mes côtelettes humides avec WPF, mais je vais sortir sur un membre ici et dire qu'essayer ajouter 40 000 contrôles est votre véritable goulot d'étranglement; pas tellement à la façon dont vous ajoutez les contrôles.

Même si vous avez tous les 40 000 contrôles codés en dur dans votre XAML, vous vous retrouveriez avec un temps de chargement de plus de 20 secondes.

Soit c'est la forme d'entrée de données au monde plus grand ou une planche Mine Sweeper massif ;-)

+0

C'est aussi ce que je craignais, mais j'espérais peut-être qu'il y avait un tour de magie que je ne connaissais pas ... Et je ne construis pas le tableau World Mine Mine Sweeper, mais répliquais essentiellement l'interface Excel. – Mathias

+0

Merci un million! Votre réponse m'a amené à repenser le problème et à réaliser que je peux complètement éviter le problème en changeant ma conception. – Mathias

+1

Assurez-vous également de jeter un coup d'œil à la virtualisation des lignes et des colonnes. Il s'agit de maintenir le nombre d'éléments WPF créés à un niveau bas même lorsque vous vous liez à beaucoup d'éléments. –

-1

Avez-vous essayé autour de votre boucle:

GridView.BeginUpdate(); 

// add items 

GridView.EndUpdate(); 
+0

Le 'BeginUpdate' arrêtera la mise à jour de contrôle/rafraîchissement jusqu'à ce que la' EndUpdate' est touché, ce qui économise beaucoup de temps . – ChrisF

+0

Qu'est-ce que c'est? Je ne trouve rien de similaire dans le contrôle GridView standard de WPF. Même si c'est là - la question originale était sur Grid, pas sur GridView. Mathias essaie de mettre à jour la grille lorsqu'elle est détachée de l'arbre visuel. – Anvaka

+0

Cela a du sens, mais ... le contrôle Grid ne semble pas avoir BeginUpdate() et EndUpdate(). Est-ce que je manque quelque chose? – Mathias

Questions connexes