Как создать WPF Path, который растягивается местами - PullRequest
3 голосов
/ 12 февраля 2009

Я хотел бы создать элемент управления WPF для вкладки окна и хочу, чтобы он имел определенную форму. Как то так;

      +------------------------------+
      |                              |
*     |                              |
      |                              |
   +--+                              +--+
6  |                                    |  6
   +------------------------------------+   
     6       stretching section       6

Так что маленькие вкладки внизу слева и справа внизу имеют фиксированный размер; 6х6, примерно. Но теперь я хочу, чтобы центральная секция растягивалась на ширину контейнера, в который я ее ударил.

В данный момент я использую объект Path, но не могу понять, как получить растягивающийся участок, или даже если Path - правильный путь.

Кто-нибудь может предложить лучший способ создать такую ​​форму наполовину растягиваемой?

Ответы [ 3 ]

3 голосов
/ 12 февраля 2009

Я выполнил растяжку в своем приложении, создав «StretchStackPanel», который наследуется от StackPanel. Класс выглядит так:

public class StretchStackPanel : StackPanel
{
    public static DependencyProperty StretchDependencyProperty = DependencyProperty.Register("Stretch", typeof(StretchMode), typeof(StretchStackPanel));

    protected override Size MeasureOverride(Size availableSize)
    {
        var baseSize = base.MeasureOverride(availableSize);

        if (availableSize.Width != double.PositiveInfinity && (Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = availableSize.Width;    
        }
        if (availableSize.Height != double.PositiveInfinity && (Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = availableSize.Height;
        }

        return baseSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        var baseSize = base.ArrangeOverride(finalSize);

        if ((Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = finalSize.Width;    
        }

        if ((Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = finalSize.Height;
        }
        return baseSize;
    }

    [Category("Layout")]
    public StretchMode Stretch
    {
        get
        {
            return (StretchMode)GetValue(StretchDependencyProperty);
        }
        set
        {
            SetValue(StretchDependencyProperty, value);
        }
    }
}

То, что вы хотите, это Сетка с 2 рядами. Содержание верхнего ряда должно иметь горизонтальное выравнивание по центру. содержимое нижнего ряда должно быть StretchStackPanel.

3 голосов
/ 12 февраля 2009

Почему бы не создать два разных виджета? Один для центральной секции, а другой для растягиваемой секции. Затем склейте их в другой контейнер, чтобы сформировать единый элемент управления.

2 голосов
/ 12 февраля 2009

Я думаю, что вы должны переопределить метод MeasureOverride в вашем элементе управления и получить DesiredSize вашего контента (вызвав метод Measure для Content / Children). Затем вы можете создать свой путь на основе этого размера.

...