Пользовательский макет элемента управления StackPanel с правым выравниванием в Silverlight - PullRequest
1 голос
/ 03 февраля 2010

Я пытаюсь создать пользовательский контейнер макета с теми же характеристиками StackPanel, за исключением того, что он размещает элементы, начиная с правого края экрана. Излишне говорить, что это не работает правильно.

Я обнаружил недостаток внутри 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);
    }

1 Ответ

1 голос
/ 03 февраля 2010

Вам нужно просто вернуть desiredSize из вашей реализации MeasureOverride, вы не хотите вызывать базовую версию этого метода, вы заменяете реализацию по умолчанию своей.

Аналогично ArrangeOverride вы предоставляете реализацию, вы заменяете реализацию по умолчанию, поэтому не вызывайте базовую версию этого метода. Просто верните finalSize.

...