Я пытаюсь создать собственный контейнер макета с теми же характеристиками StackPanel, за исключением того, что он содержит элементы, начинающиеся с правого края экрана. Излишне говорить, что это работает неправильно.Пользовательский шаблон управления правой строкой StackPanel в Silverlight
Я определил недостаток в ArrangeOverride(), где линия
Point elementOrigin = new Point(this.DesiredSize.Width, 0);
просто создает точку @ 0, 0. Другими словами this.DesiredSize.Width = 0. Я понимаю, что шаг измерения происходит до этапа организации, поэтому я ожидаю, что этот элемент управления будет иметь свойство DesiredSize. Как я мог начать рендеринг с правой стороны экрана? Возможно ли это?
Во-вторых, аргумент finalSize, который передается функции, намного больше, чем площадь, требуемая тремя кнопками, которые я определил в тестовом xaml. Что-то до мелочей 1676 на 909 против требуемого 250 на 60 или около того. Спасибо.
Вот мой код:
protected override Size MeasureOverride(Size availableSize)
{
Size availableSpace = new Size(double.PositiveInfinity, double.PositiveInfinity);
Size desiredSize = new Size(0, 0);
foreach (UIElement child in this.Children)
{
child.Measure(availableSpace);
desiredSize.Width += child.DesiredSize.Width;
desiredSize.Height = Math.Max(desiredSize.Height, child.DesiredSize.Height);
}
return base.MeasureOverride(desiredSize);
}
protected override Size ArrangeOverride(Size finalSize)
{
Point elementOrigin = new Point(this.DesiredSize.Width, 0);
foreach (UIElement child in this.Children)
{
Rect childBounds = new Rect(elementOrigin, child.DesiredSize);
elementOrigin.X -= child.DesiredSize.Width;
child.Arrange(childBounds);
}
return base.ArrangeOverride(finalSize);
}