簡體   English   中英

Windows Forms C#繪制整個可滾動面板

[英]Windows Forms C# draw whole scrollable panel

我在Windows Forms C#中的可滾動面板有問題。

我的情況我有一個帶有tabControl的窗體。 在其中的1個標簽中,我有一個面板,可填充整個標簽並且可以滾動。 在運行時,我用大約60個其他面板填充該面板,並在每個添加的面板中填充6張圖片。 這導致我可以向下滾動1個大面板。

我的問題現在,在我的不良PC上繪制這些子面板中的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);
            }
        }

激活表單后,加載一個面板,其余的可以加載到后台工作程序中並調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM