Любой макет, который может быть выполнен с помощью Canvas, также может быть выполнен с помощью Grid.
Например, возьмите Canvas, Grid с одним RowDefinition и ColumnDefinition и немного UIElement (Border).Границу можно расположить в Canvas, используя свойства Top и Left, и в том же месте Grid, используя свойство Margin:
<Canvas>
<Border Canvas.Left="20" Canvas.Top="10" Width="50" Height="50" Background="Purple"/>
</Canvas>
<Grid>
<Border Margin="20,10,0,0" Width="50" Height="50" Background="Purple"/>
</Grid>
Чтобы иметь более продвинутую функциональность, вы даже можете реализовать свой собственный тип Panel:
public class BraveNewPanel: Panel
{
protected override Size MeasureOverride(Size availableSize)
{
// measure children
}
protected override Size ArrangeOverride(Size finalSize)
{
// arrange children
}
}