2017-06-03 71 views
-1

我在面板中只有2000個32wx32h的PictureBox,呈網格狀。我認爲這是問題,所以我將它設置爲1,250個PictureBoxes(50w25h),並且我遇到了同樣的問題。爲什麼我的WinForms面板的滾動條凍結了應用程序?

這不是一個實時事件循環。這只是一堆並排等待事件的控制。

我所做的是向下滾動和向上..工作正常。左,右...工作正常。一些滾動1-2分鐘後,它凍結了整個應用程序。

我的面板的AutoScroll設置爲True。我自己的代碼在滾動條上沒有任何操作。它所做的只是滾動十億個PictureBoxes。

我注意到,禁用滾動條不會凍結應用程序,所以我認爲這是一個滾動條問題。

調試器沒有提供任何信息。

Process Memory表示正在使用17.9mb。

這似乎總是可以通過以下步驟重現:向下滾動垂直條,例如向下一半,然後鬆開鼠標按鈕,向上移動到右上角的紅色「X」窗戶,它凍結。

其他時間只是將垂直和水平滾動條移動30秒到2分鐘,然後它隨機凍結。

新注意:在凍結過程中,我注意到大約5-10秒後滾動條可以再次移動。然後很快回到一個簡短的凍結並重復。

上的負載,這是用於初始化網格:

 // Initialize a blank map 
     for (int row = 0; row < m_mapInfo.Rows; row++) 
     { 
      for (int col = 0; col < m_mapInfo.Columns; col++) 
      { 
       PictureBox pb = new PictureBox(); 
       pb.Size = size; 
       Point loc = new Point(m_mapInfo.TileWidth * col, m_mapInfo.TileHeight * row); 
       Rectangle srcRect = new Rectangle(loc, size); 
       pb.Location = loc; 
       pb.Tag = -1; 
       pb.Name = String.Format("Col={0:00}-Row={1:00}", col, row); 
       pb.BackColor = Color.Gray; 
       pb.MouseDown += pbMap_MouseDown; 
       pb.MouseUp += pbMap_MouseUp;  
       pnlMap.Controls.Add(pb); 
      } 
     } 
+0

一個PictureBox是一個重要的控件,當你有這麼多的顯示在一個窗體中時,它接近你的窗體運行的奇蹟。相反,你應該在表單表面手動繪製你想要的圖片,這是非常少的資源消耗。 – TruthSeeker

+0

PictureBox的有用之處在於Tag屬性,它包含單元格的數據。我也可以點擊每個PictureBox來觸發某些事件。我不知道是否直接繪製面板可以帶來這些好處,但可能需要從不同的設計角度來看待它。當我將AutoScroll設置爲false時,相同數量的PictureBox就沒有問題。我猜這個面板沒有滾動條顯示,所以問題不明顯。我也只是使用17.9mb,所以記憶方面看起來很小。資源佔用可能是一個不同的問題。 – Phil

+0

_2,000 32wx32h PictureBoxes_Ouch!太多了! Gp拍攝DGV或直接繪製! – TaW

回答

0

絞刑似乎是一個錯誤,而在Visual Studio 2017年調試模式下我的解決辦法是將窗口最大化和麪板,而不是使用滾動條。如果我最初沒有使用滾動條,我的窗口最大化,它可以很好地工作,並具有出色的性能。如果我將窗口縮小到原始大小並使用滾動條,它將在30秒內 - 2分鐘內掛起應用程序。這兩種情況都用相同數量的PictureBox進行了測試。

相關問題