Существует ли элемент управления WFG "WrapGrid" или простой способ его создания? - PullRequest
3 голосов
/ 09 июня 2010

По сути, я хочу wrapPanel, но я бы хотел, чтобы элементы привязывались к сетке, а не прижимались к левому краю, чтобы я мог получить красивую равномерно выглядящую сетку, которая автоматически потребляет доступное пространство.

WrapPanel обрабатывает часть изменения размера.WPF.Contrib.AutoGrid обрабатывает красивую автоматическую сетку.

Кто-нибудь получил элемент управления, который объединяет их?

Мой пример использования - у меня есть несколько элементов управления неправильной формы.Я хотел бы, чтобы они отображались в хороших столбцах, чтобы при размещении элемента управления панель переноса была привязана к следующей «остановке табуляции»

Ответы [ 3 ]

1 голос
/ 10 июня 2010

Когда я прочитал ваш вопрос, я предположил, что вы хотели что-то вроде этого:

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", и из ваших комментариев вы указываете, что это не то, что вы искалиfor.

Комментарий, который я не понимаю:

Я хочу, чтобы он не заставлял элементы иметь заданный размер, а использовал их уже существующий размер и, следовательно, определял ширину столбцов.автоматически

Не могли бы вы привести пример, иллюстрирующий, как вы хотите, чтобы вещи были разного размера?Картинка может быть хорошей.Вы также упоминаете "tabstop", но не даете никакого определения того, что это будет.

0 голосов
/ 10 июля 2010

Вот код, который я взбил на основе других близких элементов управления.Он делает приличную работу по созданию макета, хотя имеет проблему, когда элементы управления grand-child не заполняют все доступное пространство.

  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);
    }
0 голосов
/ 09 июня 2010

Попробуйте установить 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>
...