2011-10-02 61 views
0

所以我有一个垂直包装的包装纸。这些项目是在运行时添加的,但所有这些项目(用户控件)具有不同的宽度,并且因为wrappanel是垂直包装的,所以它们将它们堆叠起来,当它们覆盖垂直空间时,它们将包装到下一列。但我需要的是“种类”双向包装,即我添加了第一个宽度为200px的项目,然后我添加了第二个项目,宽度为50px,但是当我添加第三个项目时,像100px宽度我希望它不会去到下一行,但将自己置于该自由点50px控件留在那里取决于顶部的200px控件(留下150px空间和100px控件明显适合)。当然,如果它不合适,它会卷到下一行,这一切都可以。用“双面包装”包装面板

下面是一个图像,以澄清这一点(不能在这里upload'em):

这是发生了什么: image 1

而这正是我想要的: image 2


对不起,我的英语,这不是我的主要语言。我希望你能理解我的问题。

回答

0

你绝对不能使用单个面板来完成!你可以使用一个堆叠面板在哪里插入多个水平方向的动态wrappanel,以便有你需要的“列”行为

+0

这是我必须用一个单一的面板做到这一点的问题:\我可以像Wrappanel-IN-A-wrappanel,但是,这并不为工作我... 我在想一个自定义的包装,但这就是我要求的;如何写一个在我描述的行为中起作用的人:? – vytaslll

0

嗯,我做到了。只是写了一个自定义的包装与我想要的行为。

这就是:

public class TwoWayWrapPanel : Panel 
{ 
int _rowCount = 0; 

public int RowCount 
{ 
    get { return _rowCount; } 
    set { _rowCount = value; } 
} 

protected override Size MeasureOverride(Size availableSize) 
{ 
    Size resultSize = new Size(0, 0); 
    double columnWidth = 0; 
    double usedSpace = 0; 
    double nullX = 0; 
    double currentX = 0; 
    double currentY = 0; 
    bool isFirst = true; 
    int row = 0; 

    foreach (UIElement child in Children) 
    { 
     child.Measure(availableSize); 

     if (isFirst) 
     { 
      columnWidth = child.DesiredSize.Width; 
      resultSize.Width += columnWidth; 
      currentY += child.DesiredSize.Height; 
      row++; 
      isFirst = false; 
     } 
     else 
     { 
      if (columnWidth >= usedSpace + child.DesiredSize.Width & _rowCount > 1) 
      { 
       currentX = nullX + usedSpace; 
       usedSpace += child.DesiredSize.Width; 
      } 
      else 
      { 
       row++; 

       if (row + 1 > _rowCount | child.DesiredSize.Width > columnWidth) 
       { 
        row = 0; 
        currentX = nullX + columnWidth; 
        nullX = currentX; 
        usedSpace = 0; 
        columnWidth = child.DesiredSize.Width; 
        currentY = child.DesiredSize.Height; 
        row++; 
        resultSize.Width += columnWidth; 
       } 
       else 
       { 
        currentY += child.DesiredSize.Height; 
        currentX = nullX; 
        usedSpace = child.DesiredSize.Width; 
       } 
      } 
     } 
    } 

    return resultSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    double columnWidth = 0; 
    double usedSpace = 0; 
    double nullX = 0; 
    double currentX = 0; 
    double currentY = 0; 
    bool isFirst = true; 
    int row = 0; 

    foreach (UIElement child in Children) 
    { 
     //First item in the collection 
     if (isFirst) 
     { 
      child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height)); 
      columnWidth = child.DesiredSize.Width; 
      currentY += child.DesiredSize.Height; 
      row++; 
      isFirst = false; 
     } 
     else 
     { 
      //Current item fits so place it in the same row 
      if (columnWidth >= usedSpace + child.DesiredSize.Width & _rowCount > 1) 
      { 
       currentX = nullX + usedSpace; 
       child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height)); 
       usedSpace += child.DesiredSize.Width; 
      } 
      else 
      { 
       row++; 

       //The row limit is reached or the item width is greater than primary item width. Creating new column 
       if (row + 1 > _rowCount | child.DesiredSize.Width > columnWidth) 
       { 
        row = 0; 
        currentY = 0; 
        currentX = nullX + columnWidth; 
        nullX = currentX; 
        usedSpace = 0; 
        child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height)); 
        columnWidth = child.DesiredSize.Width; 
        currentY += child.DesiredSize.Height; 
        row++; 
       } 
       //Item doesn't fit. Adding to the new row in the same column 
       else 
       { 
        usedSpace = 0; 
        currentY += child.DesiredSize.Height; 
        currentX = nullX; 
        child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height)); 
        usedSpace += child.DesiredSize.Width; 
       } 
      } 
     } 
    } 

    return finalSize; 
} 
}