如何创建一个在某些地方伸展的WPF路径

时间:2009-02-12 11:50:04

标签: wpf canvas pathgeometry

我想为窗口选项卡创建一个WPF控件,我希望它具有特定的形状。像这样的东西;

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

所以左下角和右下角的小标签是固定大小的; 6x6,粗略。但现在我希望中心部分伸展到我拍打它的任何容器的宽度。

我现在正在使用Path对象,但我无法弄清楚如何获得拉伸部分,或者即使Path是正确的方法。

有人能建议创造这种半拉伸形状的最佳方法吗?

3 个答案:

答案 0 :(得分:3)

为什么不创建两个不同的小部件?一个用于中心部分,另一个用于可伸展部分。然后将它们粘在另一个容器中,形成统一的控制。

答案 1 :(得分:3)

我通过创建一个继承自StackPanel的“StretchStackPanel”在我的应用程序中完成了拉伸部分。该课程如下:

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。

答案 2 :(得分:2)

我认为您应该覆盖控件中的MeasureOverride方法并获取内容的DesiredSize(通过调用Content / Children上的Measure方法)。然后,您可以根据此大小创建路径。