【问题标题】:How to create a WPF Path which stretches in places如何创建在某些地方延伸的 WPF 路径
【发布时间】:2009-02-12 11:50:03
【问题描述】:

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

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

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

我目前正在使用 Path 对象,但我不知道如何获得拉伸部分,或者即使 Path 是正确的方法。

谁能建议创建这种半可拉伸形状的最佳方法?

【问题讨论】:

    标签: wpf canvas pathgeometry


    【解决方案1】:

    我通过创建一个继承自 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】:

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

      【讨论】:

      • 不幸的是,我必须在形状中添加一个复杂的填充,并在其周围添加一个描边。三个控件将具有三种不同的笔触,并且填充会严重对齐。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多