为什么我的WinForms面板的滚动条会冻结应用程序?

时间:2017-06-03 04:33:10

标签: c# winforms

我在面板中只有2,000个32wx32h PictureBox,网格状。我认为这是问题,所以我把它设置为1,250 PictureBoxes(50w25h),我遇到了同样的问题。

这不是实时事件循环。这只是一堆控制并排等待事件。

我做的是向下滚动向上..工作正常。左右......工作正常。经过一段时间滚动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);
            }
        }

2 个答案:

答案 0 :(得分:0)

在Visual Studio 2017的调试模式下,挂起似乎是一个错误。我的解决方案是最大化窗口和面板而不使用滚动条。如果我最初没有使用滚动条我的窗口最大化,它可以很好地工作,具有出色的性能。如果我将窗口缩小到原始大小并使用滚动条,它会在30秒 - 2分钟内挂起应用程序。这两种情况都使用相同数量的PictureBox进行了测试。

答案 1 :(得分:0)

问题出在AutoScroll上。我也在2016年的一个音乐播放器项目中体验过这一点。我发现摆脱这个问题的最好方法是:

  1. 将所有图片框添加到控件之类的面板中。
  2. 不要停靠面板并将AutoScroll设置为False
  3. 将面板的高度设置为(最后一个图片框的location.y +图片框的高度)(您可以根据UI需求增加高度)
  4. 现在使用垂直滚动条移动panel.top。