是否有可用的WPF“WrapGrid”控件或创建该控件的简单方法?

3
基本上我想要一个WrapPanel,但我希望项目能够捕捉到网格而不是紧贴在左边,这样我就可以得到一个漂亮的统一外观的网格,它会自动占用可用空间。
WrapPanel处理了调整大小的部分。WPF.Contrib.AutoGrid提供了一个漂亮的自动网格。
有人有结合这两种控件的方法吗?
我的使用情况是我有一系列形状有些不规则的控件。我希望它们出现在漂亮的列中,所以当放置控件时,包装面板应该捕捉到下一个“制表位”。

1
UniformWrapPanel非常接近我想要的,但我不希望它强制项目成为给定大小,而是使用它们已经存在的大小,因此自动确定列宽。 - Jason Coyne
3个回答

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”,但没有给出任何定义。


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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接