2009-09-28 63 views
1

對於個人項目,我需要基於可變大小數組的內容動態填充網格。我沿着下面的代碼使用代碼來做到這一點,並且它運行良好,除了當數組變大(如200 x 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個控件是你真正的瓶頸;而不是如何添加控件。

即使您在XAML中硬編碼了所有40,000個控件,仍然會以20+秒的加載時間結束。

要麼這是世界上最大的數據輸入表單或大規模掃雷板;-)

+0

這也是我所害怕的,但我希望也許有一個我不知道的魔術......我並沒有建立世界錦標賽掃雷人板,但基本上覆制了Excel用戶界面。 – Mathias 2009-09-28 23:38:25

+0

謝謝!你的回答讓我重新思考這個問題,並意識到我可以通過改變我的設計完全避免這個問題。 – Mathias 2009-09-30 02:26:11

+1

另外請確保您查看行和列虛擬化。這是所有關於保持創建的WPF元素的數量低,即使當你綁定到很多元素。 – 2010-04-23 17:27:15

-1

您是否嘗試過周圍的循環中:

GridView.BeginUpdate(); 

// add items 

GridView.EndUpdate(); 
+0

的'BeginUpdate'將停止更新控制/刷新,直到'EndUpdate'被擊中,從而節省顯著大量的時間。 – ChrisF 2009-09-28 22:11:11

+0

那是什麼?在標準的WPF GridView控件中找不到類似的東西。即使它在那裏 - 原來的問題是關於Grid,而不是GridView。 Mathias嘗試在從可視樹中分離時更新網格。 – Anvaka 2009-09-28 22:21:49

+0

這很有道理,但是...網格控件似乎沒有BeginUpdate()和EndUpdate()。我錯過了什麼嗎? – Mathias 2009-09-28 22:21:57