2010-06-09 50 views
2

本质上我想要一个wrapPanel,但我希望项目能够捕捉到一个网格,而不是被按到左边,这样我就可以获得一个很好的统一外观网格,这会自动消耗可用空间。是否有WPF“WrapGrid”控件可用或创建一个简单的方法?

WrapPanel处理调整大小的部分。 WPF.Contrib.AutoGrid处理一个不错的自动网格。

任何人都得到了一个结合他们的控制?

我用例是我有一系列有点不规则形状的控制。我想他们会在尼斯列,以便在画布面板应捕捉到下一个“制表位”放置一个控制

+1

UniformWrapPanel非常接近我想要的,除非我希望它不强制项目是一个给定的大小,但使用他们已经存在的大小,并因此自动确定列宽度 – 2010-06-09 20:10:55

回答

0

下面是一些代码,我掀起了基于一些是接近其他控件的。它做布局的体面工作,虽然它有一个问题,即盛大儿童控制不能填满所有可用空间。

protected override Size ArrangeOverride(Size finalSize) 
    { 
     double rowY = 0; 
     int col = 0; 
     double currentRowHeight = 0; 


     foreach (UIElement child in Children) 
     { 
      var initialSize = child.DesiredSize; 
      int colspan = (int) Math.Ceiling(initialSize.Width/ ColumnSize); 
      Console.WriteLine(colspan); 
      double width = colspan * ColumnSize; 



      if (col > 0 && (col * ColumnSize) + width > constrainedSize.Width) 
      { 
       rowY += currentRowHeight; 
       col = 0; 
       currentRowHeight = 0; 
      } 


      var childRect = new Rect(col * ColumnSize, rowY, width, initialSize.Height); 
      child.Arrange(childRect); 
      currentRowHeight = Math.Max(currentRowHeight, initialSize.Height); 
      col+=colspan; 
     } 

     return finalSize; 
    } 

    Size constrainedSize; 

    protected override Size MeasureOverride(Size constraint) 
    { 
     constrainedSize = constraint; 
     return base.MeasureOverride(constraint); 
    } 
-1

尝试设置WrapPanel的ItemWidth(或ItemHeight)属性时:

<WrapPanel ItemWidth="48"> 
    <TextBlock Text="H" Background="Red"/> 
    <TextBlock Text="e" Background="Orange"/> 
    <TextBlock Text="l" Background="Yellow"/> 
    <TextBlock Text="l" Background="Green"/> 
    <TextBlock Text="o" Background="Blue"/> 
    <TextBlock Text="!" Background="Violet"/> 
    </WrapPanel> 
1

当我看了你的问题,我假设你想是这样的:

public class UniformWrapPanel : WrapPanel 
{ 
    protected override Size MeasureOverride(Size constraint) 
    { 
    if(Orientation == Orientation.Horizontal) 
     ItemWidth = Children.Select(element => 
     { 
      element.Measure(constraint); 
      return element.DesiredWidth; 
     }).Max(); 
    else 
     ... same for vertical ... 

    return base.MeasureOverride(constraint); 
    } 
} 

但我看到别人已经实施了“UniformWrapPanel”,并从你的意见,你表示这并不是你所期待的。

我不明白的注释是:

我希望它不会迫使项目在给定的尺寸,但使用他们现有的大小,因此自动确定列宽

您能否举一个例子来说明您希望如何设计各种尺寸的东西?一张照片可能不错。你也提到“tabstop”,但不要给出任何定义。