使面板可滚动

Make Panel scrollable

我正在开发一个简单的 Windows 表单应用程序,它包含一个 Panel,我在其中使用 Graphic 绘制图形。比方说,我的面板现在的大小是 300x300,但里面的内容是 500x500。显然,我需要向 Panel.

添加滚动条

到目前为止我的代码:

public CircuitControl()
{
    // Initialize empty list of circuit objects
    CircuitObjects = new List<CircuitObject>();

    drawingAreaPanel.AutoScroll = true;
    drawingAreaPanel.VerticalScroll.Enabled = true;
    drawingAreaPanel.VerticalScroll.Visible = true;
    drawingAreaPanel.HorizontalScroll.Enabled = true;

    drawingAreaPanel.MaximumSize = new Size(300, 300);
    drawingAreaPanel.Size = new Size(600, 600);
}

但是 none 这些代码实际上创建了一个滚动条。我的问题是:在哪里以及如何设置我实际绘制的 Panel 的大小?我认为这是缺少的部分。谢谢。

只需添加:

drawingAreaPanel.AutoScroll = true;

而且会自动完成。

€dit:不要忘记设置锚点以获得滚动条。

滚动条只有在 Panel 中确实存在您无法全部看到的内容后才会显示。

尝试在 Panel 内放置一个更大的控件,例如 PictureBox,并将 PictureBox 的初始大小设置为大于 Panel

一个简洁明了的方法是设置 AutoScrollMinSize。这会显示滚动条(如果您将另一个值保留为 0,则只显示一个)。
现在通过图形对象绘制将不会自动滚动。 这可以通过变换矩阵轻松实现,变换矩阵在绘制之前设置并通过滚动偏移平移绘图。
一个漂亮的例子:(这当然会闪烁而无需进一步优化)

private void button1_Click(object sender, EventArgs e)
{
    using(Form frm = new Form())
    {
        Panel pnl = new Panel();
        pnl.Paint += delegate (Object snd, PaintEventArgs e2)  {
            Matrix mtx = new Matrix();
            mtx.Translate(pnl.AutoScrollPosition.X, pnl.AutoScrollPosition.Y);
            e2.Graphics.Transform = mtx;
            e2.Graphics.Clear(Color.Black);
            for(int i=0; i <= 125; i++)
                for(int j=0; j <= 125; j++)
                    using(Brush b = new SolidBrush(Color.FromArgb(255, 255-i*2, j*2, (i*j) % 255)))
                        e2.Graphics.FillRectangle(b, new Rectangle(5+j*20, 5+i*20, 20, 20));
        };
        pnl.AutoScrollMinSize = new Size(126*20+10, 126*20+10);
        pnl.Dock = DockStyle.Fill;
        frm.Controls.Add(pnl);
        frm.Padding = new Padding(25);
        frm.ShowDialog(this);
    }
}