【问题标题】:Make Panel scrollable使面板可滚动
【发布时间】:2016-04-29 10:45:07
【问题描述】:

我正在开发一个简单的 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);
}

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

【问题讨论】:

    标签: c# winforms panel


    【解决方案1】:

    只有在Panel 中确实存在您看不到所有内容的内容之前,滚动条才会显示。

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

    【讨论】:

    • 好的。这有效并解决了我问题的第一部分。但是现在我已经在可见区域之外绘制了Panel,这不会创建任何滚动条。有没有办法通过绘图来绘制和创建滚动条?还是我需要创建实际的Control
    • 最简单的方法可能就是在Panel 中创建一个Panel,然后在内部绘制。
    • 您还可以使用图形上下文绘制到Bitmap 对象,并使用PictureBox 而不是Panel。如果您给PictureBoxes 提供太大而无法显示的图像,@es 将自动滚动。
    • 我接受了这个答案,因为它引导我走向正确的道路。具有动态计算大小的面板内部面板是解决方案。这节省了我很多时间将所有绘制的元素转换为Controls。
    【解决方案2】:

    只需添加:

    drawingAreaPanel.AutoScroll = true;
    

    它会自动完成。

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

    【讨论】:

    • 正如您在我的源代码中看到的那样,它已经存在。锚点设置为左上角。也有 4 个锚它不起作用。
    • 如果你想要一个垂直滚动条,据我所知,你必须将锚点设置在顶部。除此之外,面板中必须有内容,因为如果没有可滚动的内容,滚动条将不会出现。
    【解决方案3】:

    一个干净简单的方法是设置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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2017-05-05
      • 2011-12-19
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2013-03-13
      相关资源
      最近更新 更多