/ / ¿Cómo puedo acelerar la adición de controles a una cuadrícula de WPF? - wpf, performance, grid

¿Cómo puedo acelerar la adición de controles a una cuadrícula de WPF? - wpf, performance, grid

Para un proyecto personal, necesito dinámicamenterellenar una cuadrícula, en función del contenido de una matriz de tamaño variable. Utilizo código a lo largo de las líneas que se encuentran debajo para hacer eso, y funciona bien, excepto que cuando la matriz crece (como en 200 x 200 o más) se vuelve lenta (más de 20 segundos para poblar). Parece que la creación de instancias de los botones es rápida, pero agregar a la cuadrícula es lento.
¿Estoy haciendo algo mal? ¿Hay algo que pueda hacer para acelerar el proceso utilizando la cuadrícula WPF regular? ¿Debo mirar a otro control? Gracias de antemano por cualquier sugerencia.

        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);
}
}

Respuestas

1 para la respuesta № 1

Admito que todavía estoy mojándome las chuletas conWPF, pero voy a arriesgarme aquí y te diré que intentar agregar 40,000 controles es tu verdadero cuello de botella, no tanto como la forma en que estás agregando los controles.

Incluso si tuviera todos los 40,000 controles codificados en su XAML, todavía terminaría con un tiempo de carga de más de 20 segundos.

O bien este es el formulario de ingreso de datos más grande del mundo o una tabla masiva de Mine Sweeper ;-)


-1 para la respuesta № 2

¿Has probado rodeando tu bucle en:

GridView.BeginUpdate();

// add items

GridView.EndUpdate();