Как заявил Люциус, создание класса Container является лучшим решением.В настоящее время я разрабатываю UI-приложение для XBox.
Для этого мне нужно было что-то вроде движка позиционирования, причем все относительно, поэтому мне не нужно каждый раз вычислять пиксельные элементы.
Я создал класс Container, который содержит примерно следующие атрибуты:
VectorTopLeft (Which the element which contains a Container object uses for drawing)
VectorTopRight
VectorBottomLeft
VectorBottomRight
Align (Enum: Right, Center, Left)
VerticalAlign (Enum: Top, Middle, Bottom)
NewRow (bool)
PreviousContainer (Container)
ParentContainer (Container)
Width (Getter)
Height (Getter)
PercentageHeight (getter/setter) (Percentage of the height of the parent container)
PercentageWidth (getter/setter) (Percentage of the width of the parent container)
PixelHeight (getter/setter) (Absolute height in pixels)
PixelWidth (getter/setter) (Absolute width in pixels)
AspectRatio: Used for setting the width to a ratio of the height, usefull for different screen aspects (4/3 or 16/9 for example)
MarginLeft
MarginRight
MarginTop
MarginBottom
Следующие векторы содержат поля, это векторы, используемые процедурой выравнивания.
AbsoluteVectorTopLeft
AbsoluteVectorTopRight
AbsoluteVectorBottomLeft
AbsoluteVectorBottomRight
Атрибуты размера также включают поля, полезные для вычисления оставшихся размеров
AbsoluteWidth (getter)
AbsoluteHeight (getter)
А затем некоторые флаги, которые устанавливаются в true, если что-то решающее меняется, и необходимо пересчитать вектор / размер.
Процесс выравнивания довольно сложен, так как он использует рекурсию и также вызывает предыдущие контейнерные функции, чтобы переместить все в нужное место.
Атрибут newrow сообщает системе, что ему нужно запустить элемент сновая строка в родительском контейнере, и используется для хранения вершинывсе в порядке.
Система может иметь некоторые незначительные недостатки, но в данный момент она работает как шарм для всего моего позиционирования, связанного с GUI, и работает чертовски быстро!