Что вы ищете является 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
и имеет доступ к фактическим местоположениям детей.
Для получения подробных руководств я бы использовал Bing "WPF Panel Tutorial" или "WPF Custom Panel Tutorial". Вот one that looked good.
спасибо большое! если бы я мог дать вам +5! – Peter