Я предполагаю, что вы хотите поместить свой пользовательский элемент управления (MyCustomControl) в визуальный контейнер (в данном случае WrapPanel).
Я обнаружил, что поиск свойств ActualWidth и ActualHeight в событии OnLoaded не работает, поскольку процесс макета в Silverlight еще не завершен.
В каждом визуальном контейнере реализован двухэтапный процесс, отвечающий за определение размера и организацию дочерних элементов управления.
В качестве примера приведем класс панели, реализующий только что упомянутый двухэтапный процесс (MeasureOverride () и ArrangeOverride ()).
public class RowPanel : Panel
{
private const double _groupSpace = 80;
public Point Location;
public RowPanel ()
: base()
{
Location = new Point();
}
protected override Size MeasureOverride ( Size availableSize )
{
Size size = new Size( double.PositiveInfinity, double.PositiveInfinity );
foreach ( UIElement child in Children )
child.Measure( size );
return this.ArrangeNodes( false );
}
protected override Size ArrangeOverride ( Size finalSize )
{
return this.ArrangeNodes( true );
}
private Size ArrangeNodes ( bool arrange )
{
double pos = 0d;
Rect bounds = new Rect();
Size totalSize = new Size( 0, 0 );
foreach ( UIElement child in Children )
{
GroupPanel group = child as GroupPanel;
bounds.X = pos;
bounds.Y = 0;
bounds.Width = group.DesiredSize.Width;
bounds.Height = group.DesiredSize.Height;
if ( arrange )
{
group.Arrange( bounds );
Point b = new Point( bounds.X, bounds.Y );
group.SetValue( GroupPanel.LocationProperty, b );
}
totalSize.Width = pos + group.DesiredSize.Width;
totalSize.Height = Math.Max( totalSize.Height, group.DesiredSize.Height );
pos += ( bounds.Width + RowPanel._groupSpace );
}
return totalSize;
}
}
Я хотел бы предложить вам реализовать MeasureOverride и ArrangeOverride для визуального контейнера и пользовательского элемента управления.