我正在使用Visual Studio 2017的表单设计器,但是我发现无法通过模拟图片大小调整的方式来调整表单的大小。当我将表单的大小调整为大25%时,我希望内部的所有项目都增长25%,每个控件之间的间距也要增长该数量,而控件和表单边框之间的间距应增长25%。
我附上了这种情况的照片
有人可以指出我要实现这一目标的图书馆/方法吗?
答案 0 :(得分:2)
这不是开箱即用的;我仍然认为这不是很有用;但是也许您的特殊应用程序需要。
这是以下几行的结果:
这是示例代码:
首先,我们需要通过在每个控件的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
..?
还要注意,该示例严格处理Size
和Location
;没有其他属性受到影响。对于某些人,尤其是Fonts
,人们可以添加更多代码;例如在Item
上添加第三个Tuple
来存储原始的FontSize
。对于其他Border
宽度,没有想到合理的大小调整方法。
PictureBox
显然设置为Zoom
。