2009-09-28 2 views
1

Для личного проекта мне нужно динамически заполнить сетку, основываясь на содержимом массива переменного размера. Я использую код в соответствии с тем, что ниже для этого, и он работает хорошо, за исключением того, что, когда массив растет (как в 200 х 200 или более), он становится медленным (20+ секунд для заполнения). Похоже, что кнопки быстрого запуска быстро, но добавление в сетку происходит медленно.
Я делаю что-то неправильно? Можно ли что-то сделать, чтобы ускорить процесс, используя обычную сетку WPF? Должен ли я смотреть на другой контроль? Спасибо заранее за любые предложения.Как я могу ускорить добавление элементов управления в сетку 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); 
      } 
     } 

ответ

1

Следует признать, что я все еще получаю мой отбивные мокрый с WPF, но я собираюсь выйти на конечности здесь и сказать, что попытка добавить 40 000 элементов управления - ваше настоящее узкое место; не так, как вы добавляете элементы управления.

Даже если у вас было все 40 000 элементов управления, жестко закодированных в вашем XAML, вы все равно получите 20+ секундное время загрузки.

Либо это крупнейшая в мире форма ввода данных или массивная доска Mine Sweeper ;-)

+0

Это то, чего я тоже боюсь, но я надеялся, что, возможно, был волшебный трюк, о котором я не знал ... И я не строю совет чемпионата мира по шахматам, но, по сути, дублирую интерфейс Excel. – Mathias

+0

Спасибо, миллион! Ваш ответ заставил меня задуматься над этой проблемой и понять, что я могу полностью избежать проблемы, изменив свой дизайн. – Mathias

+1

Также убедитесь, что вы посмотрите на виртуализацию строк и столбцов. Это связано с тем, что количество созданных элементов WPF низкое, даже если вы привязываетесь к множеству элементов. –

-1

Вы пробовали окружающую свой цикл в:

GridView.BeginUpdate(); 

// add items 

GridView.EndUpdate(); 
+0

Параметр 'BeginUpdate' остановит обновление управления/освежающим, пока' EndUpdate' не попал, тем самым экономя значительное количество времени , – ChrisF

+0

Что это? Я не могу найти ничего подобного в стандартном элементе управления WPF GridView. Даже если он есть, исходный вопрос касался Grid, а не GridView. Матиас пытается обновить сетку, когда она отделена от визуального дерева. – Anvaka

+0

Это имеет смысл, но ... у элемента управления Grid нет ни BeginUpdate(), ни EndUpdate(). Я что-то упускаю? – Mathias

Смежные вопросы