То, что вы ищете, это Panel
: оно уже предоставляет свойство Children
типа UIElementCollection
, поэтому все, что вам нужно сделать, это добавить дочерние элементы и переопределить два метода:
MeasureOverride вычисляет желаемый размер вашей панели. Вы можете вернуть любой размер, который вам нравится. Чтобы занять все доступное пространство, просто верните ограничение:
protected virtual Size MeasureOverride(Size availableSize)
{
return availableSize;
}
ArrangeOverride вычисляет местоположение каждого дочернего элемента как Rect. Вы можете легко использовать вложенные свойства для хранения дополнительных данных для каждого дочернего элемента. Это могут быть общедоступные данные, такие как DockPanel.Dock или Canvas.Top, или это могут быть личные данные, которые вы используете, чтобы запомнить, где все происходит и почему. Скелет для ArrangeOverride:
protected virtual Size ArrangeOverride(Size finalSize)
{
foreach(UIElement child in Children)
{
Rect childLocation = ... code to compute child location ...
child.Arrange(childLocation);
}
return finalSize;
}
Для рисования линий вы можете использовать дочерние элементы управления или просто переопределить OnRender
и рисовать линии непосредственно в DrawingContext
. OnRender
всегда вызывается после завершения ArrangeOverride
и имеет доступ к фактическим местоположениям детей.
Для подробных уроков я бы назвал «Учебник WPF Panel» или «Учебник WPF Custom Panel». Вот тот, который выглядел хорошо .