2017-04-19 20 views
-2

簡單地說,是否有任何方法可以使用WPF中的內置面板或容器中的任何一種將子項目拉伸至以所需最小尺寸的比例填充寬度。在WPF中展開最小尺寸比例的兒童

例如,如果我有一個關閉了最後一個子填充的停靠面板,我可以得到類似於第一個圖像的結果。我怎樣才能水平拉伸這些元素來實現第二個圖像。

Desired layout

+1

通常這個你可以使用一個網格與「明星」上漿:http://stackoverflow.com/questions/1768293/what-does-the-wpf-star-do-width-100。要使其以最小尺寸工作,您可能必須執行一些代碼隱藏技巧才能將最小控件大小設置爲網格列寬度。 – vesan

+0

對不起,我應該指定我的集合中有任意數量的項目。 – Hugoagogo

+0

在這種情況下,您可能需要在添加項目時動態生成Grid的ColumnDefinitions。我不認爲其他小組會按照您的需要調整大小。你可以查看一下[這個問題](http://stackoverflow.com/questions/9000549/how-can-i-dynamically-add-a-rowdefinition-to-a-grid-in-an-itemspaneltemplate)動態生成行(對於列,它將是相同的事情)。 – vesan

回答

0

原來它比我還以爲是寫一個自定義面板比較容易的方式。對於那些以易於使用的形式在這樣的事情之後的人。

public class StretchPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size size = new Size(0, 0); 

     foreach (UIElement child in Children) 
     { 
      child.Measure(availableSize); 
      size.Width += child.DesiredSize.Width; 
      size.Height = Math.Max(size.Height, child.DesiredSize.Height); 
     } 

     size.Width = double.IsInfinity(availableSize.Width) ? 
      size.Width : availableSize.Width; 

     size.Height = double.IsInfinity(availableSize.Height) ? 
      size.Height : availableSize.Height; 

     return size; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     double total = 0; 

     foreach (UIElement child in Children) total += child.DesiredSize.Width; 

     double x = 0; 

     double factor = Math.Max(finalSize.Width/total,1); 

     foreach (UIElement child in Children) 
     { 
      double adjusted_width = child.DesiredSize.Width * factor; 
      child.Arrange(new Rect(x, 0, adjusted_width, finalSize.Height)); 
      x += adjusted_width; 
     } 

     return finalSize; 
    } 
}