c# - 像图片一样调整表格大小
问题描述
我正在使用 Visual Studio 2017 的表单设计器,但我发现无法以模拟图片调整大小的方式调整表单大小。当我将表单大小调整为 25% 时,我希望里面的所有项目都增长 25%,并且每个控件之间的间距增长该数量,控件和表单边框之间的间距增长 25%。
我附上了情况的 gif
有人可以指出我的图书馆/方法来实现这一目标吗?
解决方案
这不是开箱即用的;我仍然认为这不是很有用;但也许你的特殊应用确实需要它..
这是以下几行的结果:
所以这里是示例代码:
首先,我们需要通过在每个控件中存储旧边界以及原始父大小来进行设置: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
and Location
; 其他属性不受影响。对于某些人,尤其是Fonts
,可以添加更多代码;例如,添加第三个Item
来Tuple
存储原始FontSize
文件.. 对于其他人来说,像Border
宽度一样,没有合理的尺寸调整方法浮现在脑海。
PictureBox
显然被设置Zoom
为。
推荐阅读
- javascript - 如何通过键对javascript或打字稿中的数组进行排序,但如果键按字母顺序排序相同?
- python - 在 Flask 中建立流
- vbscript - 如何将双引号参数传递给 vbscript?
- react-native - 如何仅在某些屏幕上显示 TabNavigator 而对其他屏幕不显示?- 路由“TabNavigator”的组件必须是 React 组件
- angularjs - 仅当用户键入超过 4 个字符时,使用后端 API 的 ngSelect
- reactjs - 如何使用 npm 修复权限错误
- php - PHP IMAP:如何获得正确的正文?
- python - 绘制 numpy.histogram2d()
- python - 类实例中的条件方法执行
- c# - C#如何使用OpenCV去除验证码的噪音?