【发布时间】:2017-06-03 04:33:10
【问题描述】:
我在面板中只有 2,000 个 32wx32h PictureBoxes,呈网格状。我认为这是问题所在,所以我将其设置为 1,250 个图片框(50w25h),我遇到了同样的问题。
这不是实时事件循环。它只是一堆并排等待事件的控件。
我所做的是向下和向上滚动.. 工作正常。左右...工作正常。滚动 1-2 分钟后,它会冻结整个应用程序。
我的面板的 AutoScroll 设置为 True。我自己的代码都没有在滚动条上运行。它所做的只是滚动十亿个图片框。
我注意到禁用滚动条不会在以后冻结应用程序,所以我认为这是滚动条问题。
调试器没有给出任何信息。
进程内存说正在使用 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 是一个很重的控件,当你有这么多的图片以一个表单显示时,你的表单运行起来几乎是一个奇迹。相反,您应该在表单表面上手动绘制您想要的图片,这样消耗的资源要少得多。
-
PictureBox 的有用之处在于 Tag 属性,它保存单元格的数据。我还可以单击每个 PictureBox 来触发某些事件。我不知道直接在面板上绘图是否会带来这些好处,但可能需要从不同的设计角度来看待它。当我将 AutoScroll 设置为 false 时,相同数量的 PictureBox 没有问题。我猜目前没有滚动条的面板中显示的内容较少,因此问题并不明显。我也只是使用 17.9mb,所以内存方面看起来很小。资源占用可能是一个不同的问题。
-
2,000 个 32wx32h 图片框 哎哟!太多了!! Gp fot DGV 或直接绘制!
-
我会调查 DGV。谢谢!
-
我相信这是一个 MS 错误。如果我最大化窗口并在屏幕上有相同数量的图片框,它运行良好。应该,这是一台昂贵的计算机。如果我缩小窗口并滚动,它就会开始挂起。滚动条有些可疑,所以我只是避开它们。