【发布时间】: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 个不同的图像。由于性能问题,我没有发布此内容,而是因为我不了解此面板的加载方式