我在面板中只有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);
}
}
一個PictureBox是一個重要的控件,當你有這麼多的顯示在一個窗體中時,它接近你的窗體運行的奇蹟。相反,你應該在表單表面手動繪製你想要的圖片,這是非常少的資源消耗。 – TruthSeeker
PictureBox的有用之處在於Tag屬性,它包含單元格的數據。我也可以點擊每個PictureBox來觸發某些事件。我不知道是否直接繪製面板可以帶來這些好處,但可能需要從不同的設計角度來看待它。當我將AutoScroll設置爲false時,相同數量的PictureBox就沒有問題。我猜這個面板沒有滾動條顯示,所以問題不明顯。我也只是使用17.9mb,所以記憶方面看起來很小。資源佔用可能是一個不同的問題。 – Phil
_2,000 32wx32h PictureBoxes_Ouch!太多了! Gp拍攝DGV或直接繪製! – TaW