2010-02-02 92 views
1

我試圖創建一個自定義佈局容器,它具有與StackPanel相同的特性,但它將從屏幕右邊緣開始的項目進行佈局。不用說,它不能正常工作。自定義右對齊Silverlight中的StackPanel控件佈局

我已經確定內部ArrangeOverride一個缺陷()其中線

Point elementOrigin = new Point(this.DesiredSize.Width, 0); 

簡單地創建一個點@ 0,0。換句話說this.DesiredSize.Width = 0。據我所知,所述測量步驟發生在安排步驟之前,所以我希望這個控件將具有DesiredSize屬性集。我怎麼能從屏幕右側開始渲染呢?它甚至有可能嗎?

其次,finalSize傳遞給該函數的參數遠遠大於我在測試xaml中定義的三個按鈕所需的面積。到了90年代的1676年的曲調與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

你需要簡單地返回您desiredSizeMeasureOverride實現,你不想被調用這個方法的基礎版本,您要更換與你的默認實現。

ArrangeOverride類似,您正在提供實現,您將替換默認實現,因此不要調用此方法的基本版本。只需返回finalSize即可。