2010-02-02 6 views
1

Я пытаюсь создать собственный контейнер макета с теми же характеристиками 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); 
    } 

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^