是否有WPF“WrapGrid”控件或创建一个简单的方法?

时间:2010-06-09 19:48:12

标签: wpf layout grid wrappanel

基本上我想要一个wrapPanel,但是我希望项目能够捕捉到网格而不是向左按下,所以我可以得到一个漂亮的统一外观网格,自动消耗可用空间。

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

任何人都有一个组合它们的控件?

我的用例是我有一系列有些不规则形状的控件。我希望它们出现在漂亮的列中,这样当放置一个控件时,包装面板应该会捕捉到下一个“tabstop”

3 个答案:

答案 0 :(得分: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”,但没有给出任何定义。

答案 1 :(得分: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);
    }

答案 2 :(得分:-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>