我在面板中只有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