【问题标题】:Windows Forms C# draw whole scrollable panelWindows Forms C# 绘制整个可滚动面板
【发布时间】:2016-02-03 12:32:40
【问题描述】:

我在 Windows 窗体 C# 中的可滚动面板有问题。

我的情况 我有一个带有 tabControl 的表单。 在其中一个选项卡中,我有一个面板填充整个选项卡并且是可滚动的。 在运行时,我用大约 60 个其他面板和每个添加的面板中的 6 张图片填充此面板。这导致我可以向下滚动 1 个大面板。

我的问题 现在在我的坏电脑上绘制这些子面板中的 1 个大约需要 0.2 秒,这很好而且很容易,但我遇到的问题是它只绘制了当前在主面板中可见的东西。 即使我让主面板加载 1 分钟,他仍然只绘制前几个子面板,如果我向下滚动,他必须绘制其余部分。 如果我再次向上滚动,一切都很顺利,所以看起来它正在存储曾经绘制的所有内容。 我想要他基本上在开始时绘制整个主面板然后滚动很流畅的行为。

PS:我不确定“绘图”是否适合表格正在执行的操作。 PPS:我知道这段代码并不完美,但我并不是在抱怨性能问题,我只是想了解这个加载是如何工作的 一些代码:

private void Form1_Load(object sender, EventArgs e) {

            pnEverything.Controls.Clear();
            int yPosition = 20;
            for (int i = 1; i <= 48; i++) {
                Panel panel = new Panel();
                Label label = new Label();

                if (i % 2 != 0) {
                    panel.Location = new Point(10, yPosition);
                }
                else {
                    panel.Location = new Point(this.Size.Width / 2 + 10, yPosition);
                    yPosition += this.Size.Width / 10;
                }
                panel.Size = new Size(this.Size.Width / 2 - 80, ((this.Size.Width / 2 - 80) - 90) / 6 + 40);
                panel.Tag = i;
                panel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;

                label.AutoSize = true;
                label.Font = new Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                label.ForeColor = Color.Black;
                label.Name = "lbLade" + i;
                label.Location = new Point(panel.Width / 2 - label.Size.Width / 2, panel.Size.Height - 30);
                label.Text = i.ToString();

                panel.Controls.Add(label);

                int xPosition = 30;
                for (int j = 1; j <= 6; j++) {
                    MyPictureBox pb = new MyPictureBox();

                    pb.Location = new Point(xPosition, 10);
                    pb.Margin = new Padding(2);
                    pb.Name = "pbLade" + i + "Nummer" + j;
                    pb.Size = new Size((panel.Size.Width - 90) / 6, (panel.Size.Width - 90) / 6);
                    pb.SizeMode = PictureBoxSizeMode.StretchImage;
                    pb.Cursor = System.Windows.Forms.Cursors.Hand;
                    pb.Position.Lade = i;
                    pb.Position.Nummer = j;

                    xPosition += pb.Size.Width + 10;
                    pb.ImageLocation = @"Bilder\plus.png";
                    pb.Click += new EventHandler(pbAddCar_Click);

                    panel.Controls.Add(pb);
                }
                pnEverything.Controls.Add(panel);
            }
        }

【问题讨论】:

  • 它应该在加载时绘制所有内容。你能给我们看看代码吗?
  • PictureBox 不会使绘图变得流畅。完成工作以提高效率完全取决于您。图像的像素格式非常重要,只有 32bppPArgb 是有效的,因为它与任何现代机器上的视频帧缓冲区格式兼容。任何其他格式的渲染速度都会慢约 10 倍。并且图像的大小非常重要,必须重新缩放图像以适应图片框非常昂贵并且一遍又一遍地发生。请务必使用最佳像素格式和正确尺寸创建您自己的位图。
  • 另外你可能想解释为什么你需要有360个独立的图片框?如果您可以将它们全部组合成一个位图,那么一切都会很快。组合也可能很快。但是在winforms下发送许多控件到屏幕上很慢,除非你完美地优化它。而且图像大小的一些数字可能也会有帮助。
  • 您是在使用 360 个不同的图像还是只在发布的代码中使用一个?
  • 不,我正在使用 360 个不同的图像。由于性能问题,我没有发布此内容,而是因为我不了解此面板的加载方式

标签: c# windows winforms panel


【解决方案1】:

激活表单后,加载一个面板,剩下的你可以在后台工作人员中加载并调用。

【讨论】:

  • 抱歉,我不知道你想告诉我什么。你的意思是我应该加载哪个面板?一开始在可滚动的大面板中总是有 5 个可见的小面板
猜你喜欢
  • 2020-08-04
  • 2017-03-31
  • 1970-01-01
  • 2012-10-29
  • 2012-06-21
  • 2012-01-27
  • 2015-03-14
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多