2017-06-03 122 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进行了测试。

相关问题