Это не пробуждение из коробки;Я все еще не думаю, что это очень полезно;но, возможно, вашему специальному приложению нужно это нужно ..
Это результат нескольких строк ниже:
![enter image description here](https://i.stack.imgur.com/33iEG.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
и Location
;никакие другие свойства не затронуты.Для некоторых, особенно для Fonts
, можно добавить больше кода;например, добавьте 3 Item
к Tuple
для хранения оригинала FontSize
.. Для других, например Border
ширины, разумный метод определения размера не приходит на ум.
Очевидно, PictureBox
был установлендо Zoom
.