【问题标题】:Why is my WinForms panel's scrollbars freezing the app?为什么我的 WinForms 面板的滚动条会冻结应用程序?
【发布时间】: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 错误。如果我最大化窗口并在屏幕上有相同数量的图片框,它运行良好。应该,这是一台昂贵的计算机。如果我缩小窗口并滚动,它就会开始挂起。滚动条有些可疑,所以我只是避开它们。

标签: c# winforms


【解决方案1】:

问题出在 AutoScroll 中。我在 2016 年的一个音乐播放器项目中也经历过这种情况。我发现摆脱这个问题的最佳方法是:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多