【问题标题】:How to make a PictureBox fill a UserControl while being adjusted in the designer如何在设计器中进行调整时使 PictureBox 填充 UserControl
【发布时间】:2012-02-23 04:05:03
【问题描述】:

技术:.NET 4、C#、WinForms、Visual Studio 2010

在调整自定义 UserControl 的大小时遇到​​了问题。客户UserControl 只包含一个PictureBox,其属性设置为在必要时显示滚动条。

UserControl 具有以下属性集:

  • AutoScaleMode:字体
  • 自动滚动:真
  • 双缓冲:真
  • 最小尺寸:100、100
  • 尺寸:250、250

PictureBox 具有以下属性集:

  • 锚点:左上角
  • 位置:0,0
  • 尺寸:250、250
  • SideMode:AutoSize

在自定义控件的设计器视图中,PictureBox 填充了所需的整个like。但是,在主应用程序的设计器视图中,自定义的 UserControl 最初是 250 x 250,就像它的设计器显示的那样,但是当我调整它的大小以适应主应用程序时,只有 UserControl 面板被调整大小而留下 @987654329 @ 到原来的 250 x 250。我公开的属性之一是 PictureBox 内的鼠标光标 X、Y 位置,当没有加载图像时,该属性在 250 x 250 区域之外不返回任何内容。

我试过了:

  • 将 Anchor 属性设置为 Top、Left、Right、Bottom,但这会导致 UserControl 不显示滚动条。
  • PictureBox 的Dock 属性设置为填充,但这也会导致UserControl 不显示滚动条。

我怎样才能使PictureBox 始终是UserControl 的全尺寸,即使在设计器中进行了调整?

【问题讨论】:

  • 如果 PictureBox 填充了 UserControl,为什么需要显示 scoll 条?
  • 是的,我知道这不是很清楚。在主应用程序中,PictureBox 通常比 UserControl 大,因此会有滚动条。我的问题是,当主应用程序启动时,PictureBox 是它在设计器中创建的大小,无论 UserControl 目前是什么大小。它不再按需要填充 UserControl。
  • 您已将图片框的SizeMode属性设置为AutoSize,因此当您在图片框的Image属性中设置图像时,图片框应自行调整大小以匹配图像的大小。您是否设置了Image 属性?
  • 当我将PictureBox 设置为大于UserControl 的图像时,它会按预期工作。我正在尝试解决第一次加载 UserControl 并且大小未知的情况,但 PictureBox 仍然是我在设计器中设置的大小。

标签: c# .net winforms user-controls picturebox


【解决方案1】:

您需要用户控件上的滚动条,这样当用户控件小于 picurebox 中显示的图片时,用户可以滚动查看图片的其他部分,对吗?而且当用户控件大于图片框时,您希望图片框填充用户控件(因此您无法在图片框上捕获鼠标事件)。对吧?

首先,你也可以订阅用户控件(除了图片框)上的鼠标事件来做想要的动作。如果这不适用,您可以这样做:

处理用户控件的Resize事件,改变图片框的外观:

(把它放在你的用户控件中)

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);

        MaintainPictureBoxSize();
    }

    private void MaintainPictureBoxSize()
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.Normal;

        pictureBox1.Location = new Point();
        pictureBox1.Size = new Size();

        var clientSize = this.ClientSize;

        if (pictureBox1.Image == null)
            pictureBox1.Size = clientSize;
        else
        {
            Size s = pictureBox1.Image.Size;
            pictureBox1.Size = new Size(
                clientSize.Width > s.Width ? clientSize.Width : s.Width,
                clientSize.Height > s.Height ? clientSize.Height : s.Height);
        }
    }

在更改PictureBoxImage 时也调用MaintainPictureBoxSize 方法。
这样做的效果是,当图片框中显示的图片的宽度或高度小于用户控件时,图片框会展开以填满用户控件,如果不是,图片框的大小就是大小图像,因此显示滚动条。

【讨论】:

  • 我试过你的代码 sn-p 并且当PictureBox 应该与UserControl 大小相同时,如果没有加载图像,它会导致滚动条总是被绘制。
  • 这导致了一些奇怪的行为。最初,不存在滚动条。当我增加表单的大小时(在加载任何图像之前),仍然没有滚动条。但是,当我减小表单的大小(甚至从最大化)时,滚动条会出现并一直存在,直到我再次调整为更大的大小。
  • 我再次修改了代码。我已经对此进行了测试,它没有任何问题(调整大小时会出现一些闪烁)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多