2017-04-19 46 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; 
    } 
}