代码之家  ›  专栏  ›  技术社区  ›  Jason Coyne

有没有一个WPF“wrapgrid”控件可用或一个简单的创建方法?

  •  3
  • Jason Coyne  · 技术社区  · 14 年前

    本质上,我想要一个包装板,但我希望项目捕捉到一个网格,而不是按到左边,这样我可以得到一个漂亮的统一的网格,自动消耗可用空间。

    Wrappanel处理调整大小的零件。 autogrid处理一个很好的自动网格。

    有人能控制他们吗?

    我的用例是我有一系列形状不规则的控件。我希望它们显示在漂亮的列中,这样放置控件时,环绕面板应捕捉到下一个“tabstop”

    3 回复  |  直到 14 年前
        1
  •  1
  •   Ray Burns    14 年前

    当我读到你的问题时,我以为你想要这样的东西:

    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);
      }
    }
    

    但我看到其他人已经实施了一个“统一包装板”,从你的评论中,你指出这不是你想要的。

    我不明白的是:

    我希望它不会强制项成为给定的大小,而是使用它们已经存在的大小,从而自动确定列宽。

    你能举一个例子来说明你想要什么样的尺寸的东西吗?一张照片也许不错。你也提到了“tabstop”,但没有给出任何定义。

        2
  •  0
  •   Jason Coyne    14 年前

    下面是一些我根据其他一些接近的控件创建的代码。它做了一个不错的布局工作,虽然它有一个问题,即孙子控制不填补他们所有的可用空间。

      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);
        }
    
        3
  •  -1
  •   Anvaka    14 年前

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

       <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>