首页 > 解决方案 > 像图片一样调整表格大小

问题描述

我正在使用 Visual Studio 2017 的表单设计器,但我发现无法以模拟图片调整大小的方式调整表单大小。当我将表单大小调整为 25% 时,我希望里面的所有项目都增长 25%,并且每个控件之间的间距增长该数量,控件和表单边框之间的间距增长 25%。

我附上了情况的 gif

怎么了

使用锚点时

我想要的是

有人可以指出我的图书馆/方法来实现这一目标吗?

标签: c#formswinforms

解决方案


这不是开箱即用的;我仍然认为这不是很有用;但也许你的特殊应用确实需要它..

这是以下几行的结果:

在此处输入图像描述

所以这里是示例代码:

首先,我们需要通过在每个控件中存储旧边界以及原始父大小来进行设置:Tag

    // pick the top parent; in my case it wa a TabPage (not shown)
    Control ctrl = pickTheParent;  
    foreach (Control c in ctrl.Controls) StoreBounds(ctrl, c);
    ctrl.Resize += (ss, ee) =>
    {
        foreach (Control c in ctrl.Controls)  ScaleBounds(c);
    };

我们还为父Resize事件绑定了一个大小调整例程。

存储和调整大小都必须发生在所有控件上,包括嵌套控件;所以它们是递归的..:

void StoreBounds(Control parent, Control ctl)
{
    ctl.Tag = new Tuple<Size, Rectangle>(parent.ClientSize, ctl.Bounds);
    // **
    foreach (Control c in ctl.Controls)  StoreBounds(ctl, c);
}


void ScaleBounds(Control ctl)
{
    ctl.Bounds = ScaledBounds(ctl);
    foreach (Control c in ctl.Controls)  ScaleBounds(c);
}

大小调整只是计算旧比率并从中计算新比率:

Rectangle ScaledBounds(Control c)
{
    if (c.Tag == null) return c.Bounds;
    Rectangle old = ((Tuple<Size, Rectangle>)c.Tag).Item2;
    Size frame1 = ((Tuple<Size, Rectangle>)c.Tag).Item1;
    Size frame2 = c.Parent.ClientSize;
    float rx = 1f * frame2.Width / frame1.Width;
    float ry = 1f * frame2.Height / frame1.Height;
    int x = (int)(old.Left * rx);
    int y = (int)(old.Top * ry);
    int w = (int)(old.Width * rx);
    int h = (int)(old.Height * ry);
    return new Rectangle(x,y,w,h);
}

请注意,为了显示效果,我必须关闭任何AutoSize属性。

另请注意,所有Anchors(和任何Docks)都已删除。要自动执行此操作,您可以在存储代码中添加一两行代码 (**)..:

 ctl.Anchor = AnchorStyles.None;

删除Docking取决于您,也许有些,例如Fill,实际上仍然有用..?

另请注意,该示例严格处理Sizeand Location; 其他属性不受影响。对于某些人,尤其是Fonts,可以添加更多代码;例如,添加第三个ItemTuple存储原始FontSize文件.. 对于其他人来说,像Border宽度一样,没有合理的尺寸调整方法浮现在脑海。

PictureBox显然被设置Zoom为。


推荐阅读