Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 449791
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 12, 20262026-05-12T21:48:16+00:00 2026-05-12T21:48:16+00:00

I’m trying to make some kind of shape in wpf, which does resize itself

  • 0

I’m trying to make some kind of shape in wpf, which does resize itself to the content (which should be text). Unfortunately, the stretch property isn’t the right thing, since I want only the width of the Shape resized and without the borders (pls copy bottom example in xamlpad to see for yourself) of this shape stretched. The borders should stay the way they are, or at least scale in Uniform.
I’ve tried many ideas. With different slices of the shape in a grid, stackpanel, or with a clipped panel and etc.
My next approach would be the following one:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Page.Resources>
<LinearGradientBrush StartPoint="0.0,1" EndPoint="0.0,0" x:Key="brushYellow">
  <LinearGradientBrush.GradientStops>
    <GradientStop Offset="0.000000" Color="#fffef4a6"/>
    <GradientStop Offset="0.175824" Color="#fffef9d6"/>
    <GradientStop Offset="0.800000" Color="#fffef9d6"/>
    <GradientStop Offset="1.000000" Color="#fffef4a6"/>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush></Page.Resources><Grid>
 <Path Stroke="#fffce90d" StrokeThickness="1" Fill="{StaticResource brushYellow}">
    <Path.Data>
      <CombinedGeometry GeometryCombineMode="Exclude">
        <CombinedGeometry.Geometry1>
          <RectangleGeometry RadiusX="15" RadiusY="15">
            <!--RectangleGeometry.Rect>
              <Binding StringFormat="{}{0 0 {0} 82}" ElementName="Text" Path="Width"/>
            </RectangleGeometry.Rect-->
            <RectangleGeometry.Rect>
              <Rect Width="150" Height="82"/>
            </RectangleGeometry.Rect>
          </RectangleGeometry>
        </CombinedGeometry.Geometry1>
        <CombinedGeometry.Geometry2>
          <PathGeometry>
            <PathGeometry.Figures>
              <PathFigureCollection>
                <PathFigure IsClosed="True" StartPoint="0,15">
                  <PathFigure.Segments>
                    <PathSegmentCollection>
                      <LineSegment Point="17,41" />
                      <LineSegment Point="0,67" />
                    </PathSegmentCollection>
                  </PathFigure.Segments>
                </PathFigure>
              </PathFigureCollection>
            </PathGeometry.Figures>
          </PathGeometry>
        </CombinedGeometry.Geometry2>
      </CombinedGeometry>
    </Path.Data>
  </Path>
  <TextBox Name="Text" Background="Transparent" BorderThickness="0" MinWidth="150" Margin="0"/>
</Grid></Page>

This will work right out of the box in xamlpad. The uncommented part at line 19 is what I really want to achieve: Binding the Rect of the Rectangle to something else. Unfortunately, the Width of Rect isn’t dp, that’s why I’m using directly a stringformatted Binding to Rect itself.

As expected with life, that doesn’t work (nothing is visible) 😀
What am I doing wrong here?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-12T21:48:16+00:00Added an answer on May 12, 2026 at 9:48 pm

    I use a set of classes named ViewboxPath, ViewboxLine, ViewboxPolyline, etc that change the stretch semantics of Shape to be a little more tractable. I’m not sure I understood your question, so I don’t know if my technique will solve your problem or not.

    As I read it, either you want control over the stretching, which this solution will provide, or you want to have the strokes stretch along with the image, which Sam’s answer will provide.

    Anyhow, below is the code for these classes and this is how you use them:

    <edf:ViewboxPolyline
        Viewbox="0 0 1 1"  <!-- Actually the default, can be omitted -->
        Stretch="Fill"     <!-- Also default, can be omitted -->
        Stroke="Blue"
        Points="0,0 0.2,0 0.2,0.3 0.4,0.3" />
    
    <edf:ViewboxPolygon
        Viewbox="0 0 10 10"
        Stroke="Blue"
        Points="5,0 10,5 5,10 0,5" />
    
    <edf:ViewboxPath
        Viewbox="0 0 10 10"
        Stroke="Blue"
        Data="M10,5 L4,4 L5,10" />
    

    My Viewbox shape classes are used just like normal shapes (Polyline, Polygon, Path and Line) except for the extra Viewbox parameter, and the fact that they default to Stretch="Fill". The Viewbox parameter specifies, in the coordinate system used to specify the shape, the area of the geometry that should be stretched using Fill, Uniform or UniformToFill settings, instead of using Geometry.GetBounds.

    This gives very precise control over the stretching and makes it easy to have separate shapes align accurately with one another.

    Here is the actual code for my Viewbox shape classes, including the abstract base class ViewboxShape that contains common functionality:

    public abstract class ViewboxShape : Shape
    {
      Matrix _transform;
      Pen _strokePen;
      Geometry _definingGeometry;
      Geometry _renderGeometry;
    
      static ViewboxShape()
      {
        StretchProperty.OverrideMetadata(typeof(ViewboxShape), new FrameworkPropertyMetadata
        {
          AffectsRender = true,
          DefaultValue = Stretch.Fill,
        });
      }
    
      // The built-in shapes compute stretching using the actual bounds of the geometry.
      // ViewBoxShape and its subclasses use this Viewbox instead and ignore the actual bounds of the geometry.
      public Rect Viewbox { get { return (Rect)GetValue(ViewboxProperty); } set { SetValue(ViewboxProperty, value); } }
      public static readonly DependencyProperty ViewboxProperty = DependencyProperty.Register("Viewbox", typeof(Rect), typeof(ViewboxShape), new UIPropertyMetadata
      {
        DefaultValue = new Rect(0,0,1,1),
      });
    
      // If defined, replaces all the Stroke* properties with a single Pen
      public Pen Pen { get { return (Pen)GetValue(PenProperty); } set { SetValue(PenProperty, value); } }
      public static readonly DependencyProperty PenProperty = DependencyProperty.Register("Pen", typeof(Pen), typeof(Pen), new UIPropertyMetadata
      {
        DefaultValue = null
      });
    
      // Subclasses override this to define geometry if caching is desired, or just override DefiningGeometry
      protected virtual Geometry ComputeDefiningGeometry()
      {
        return null;
      }
    
      // Subclasses can use this PropertyChangedCallback for properties that affect the defining geometry
      protected static void OnGeometryChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
      {
        var shape = sender as ViewboxShape;
        if(shape!=null)
        {
          shape._definingGeometry = null;
          shape._renderGeometry = null;
        }
      }
    
      // Compute viewport from box & constraint
      private Size ApplyStretch(Stretch stretch, Rect box, Size constraint)
      {
        double uniformScale;
        switch(stretch)
        {
          default:
            return new Size(box.Width, box.Height);
    
          case Stretch.Fill:
            return constraint;
    
          case Stretch.Uniform:
            uniformScale = Math.Min(constraint.Width / box.Width, constraint.Height / box.Height);
            break;
    
          case Stretch.UniformToFill:
            uniformScale = Math.Max(constraint.Width / box.Width, constraint.Height / box.Height);
            break;
        }
        return new Size(uniformScale * box.Width, uniformScale * box.Height);
      }
    
      protected override Size MeasureOverride(Size constraint)
      {
        // Clear pen cache if settings have changed
        if(_strokePen!=null)
          if(Pen!=null)
            _strokePen = null;
          else
            if(_strokePen.Thickness != StrokeThickness ||
               _strokePen.Brush != Stroke ||
               _strokePen.StartLineCap != StrokeStartLineCap ||
               _strokePen.EndLineCap != StrokeEndLineCap ||
               _strokePen.DashCap != StrokeDashCap ||
               _strokePen.LineJoin != StrokeLineJoin ||
               _strokePen.MiterLimit != StrokeMiterLimit ||
               _strokePen.DashStyle.Dashes != StrokeDashArray ||
               _strokePen.DashStyle.Offset != StrokeDashOffset)
              _strokePen = null;
    
        _definingGeometry = null;
        _renderGeometry = null;
    
        return ApplyStretch(Stretch, Viewbox, constraint);
      }
    
      protected override Size ArrangeOverride(Size availableSize)
      {
        Stretch stretch = Stretch;
        Size viewport;
        Matrix transform;
    
        // Compute new viewport and transform
        if(stretch==Stretch.None)
        {
          viewport = availableSize;
          transform = Matrix.Identity;
        }
        else
        {
          Rect box = Viewbox;
          viewport = ApplyStretch(stretch, box, availableSize);
    
          double scaleX = viewport.Width / box.Width;
          double scaleY = viewport.Height / box.Height;
          transform = new Matrix(scaleX, 0, 0, scaleY, -box.Left * scaleX, -box.Top * scaleY);
        }
    
        if(_transform!=transform)
        {
          _transform = transform;
          _renderGeometry = null;
          InvalidateArrange();
        }
        return viewport;
      }
    
      protected Pen PenOrStroke
      {
        get
        {
          if(Pen!=null)
            return Pen;
          if(_strokePen==null)
            _strokePen = new Pen
            {
              Thickness = StrokeThickness,
              Brush = Stroke,
              StartLineCap = StrokeStartLineCap,
              EndLineCap = StrokeEndLineCap,
              DashCap = StrokeDashCap,
              LineJoin = StrokeLineJoin,
              MiterLimit = StrokeMiterLimit,
              DashStyle =
                StrokeDashArray.Count==0 && StrokeDashOffset==0 ? DashStyles.Solid :
                new DashStyle(StrokeDashArray, StrokeDashOffset),
            };
          return _strokePen;
        }
      }
    
      protected Matrix Transform
      {
        get
        {
          return _transform;
        }
      }
    
      protected override Geometry DefiningGeometry
      {
        get
        {
          if(_definingGeometry==null)
            _definingGeometry = ComputeDefiningGeometry();
          return _definingGeometry;
        }
      }
    
      protected Geometry RenderGeometry
      {
        get
        {
          if(_renderGeometry==null)
          {
            Geometry defining = DefiningGeometry;
            if(_transform==Matrix.Identity || defining==Geometry.Empty)
              _renderGeometry = defining;
            else
            {
              Geometry geo = defining.CloneCurrentValue();
              if(object.ReferenceEquals(geo, defining)) geo = defining.Clone();
    
              geo.Transform = new MatrixTransform(
                geo.Transform==null ? _transform : geo.Transform.Value * _transform);
              _renderGeometry = geo;
            }
          }
          return _renderGeometry;
        }
      }
    
      protected override void OnRender(DrawingContext drawingContext)
      {
        drawingContext.DrawGeometry(Fill, PenOrStroke, RenderGeometry);
      }
    
    }
    
    [ContentProperty("Data")]
    public class ViewboxPath : ViewboxShape
    {
      public Geometry Data { get { return (Geometry)GetValue(DataProperty); } set { SetValue(DataProperty, value); } }
      public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(Geometry), typeof(ViewboxPath), new UIPropertyMetadata
      {
        DefaultValue = Geometry.Empty,
        PropertyChangedCallback = OnGeometryChanged,
      });
    
      protected override Geometry DefiningGeometry
      {
        get { return Data ?? Geometry.Empty; }
      }
    }
    
    public class ViewboxLine : ViewboxShape
    {
      public double X1 { get { return (double)GetValue(X1Property); } set { SetValue(X1Property, value); } }
      public double X2 { get { return (double)GetValue(X2Property); } set { SetValue(X2Property, value); } }
      public double Y1 { get { return (double)GetValue(Y1Property); } set { SetValue(Y1Property, value); } }
      public double Y2 { get { return (double)GetValue(Y2Property); } set { SetValue(Y2Property, value); } }
      public static readonly DependencyProperty X1Property = DependencyProperty.Register("X1", typeof(double), typeof(ViewboxLine), new FrameworkPropertyMetadata { PropertyChangedCallback = OnGeometryChanged, AffectsRender = true });
      public static readonly DependencyProperty X2Property = DependencyProperty.Register("X2", typeof(double), typeof(ViewboxLine), new FrameworkPropertyMetadata { PropertyChangedCallback = OnGeometryChanged, AffectsRender = true });
      public static readonly DependencyProperty Y1Property = DependencyProperty.Register("Y1", typeof(double), typeof(ViewboxLine), new FrameworkPropertyMetadata { PropertyChangedCallback = OnGeometryChanged, AffectsRender = true });
      public static readonly DependencyProperty Y2Property = DependencyProperty.Register("Y2", typeof(double), typeof(ViewboxLine), new FrameworkPropertyMetadata { PropertyChangedCallback = OnGeometryChanged, AffectsRender = true });
    
      protected override Geometry ComputeDefiningGeometry()
      {
        return new LineGeometry(new Point(X1, Y1), new Point(X2, Y2));
      }
    }
    
    [ContentProperty("Points")]
    public class ViewboxPolyline : ViewboxShape
    {
      public ViewboxPolyline()
      {
        Points = new PointCollection();
      }
    
      public PointCollection Points { get { return (PointCollection)GetValue(PointsProperty); } set { SetValue(PointsProperty, value); } }
      public static readonly DependencyProperty PointsProperty = DependencyProperty.Register("Points", typeof(PointCollection), typeof(ViewboxPolyline), new FrameworkPropertyMetadata
      {
        PropertyChangedCallback = OnGeometryChanged,
        AffectsRender = true,
      });
    
      public FillRule FillRule { get { return (FillRule)GetValue(FillRuleProperty); } set { SetValue(FillRuleProperty, value); } }
      public static readonly DependencyProperty FillRuleProperty = DependencyProperty.Register("FillRule", typeof(FillRule), typeof(ViewboxPolyline), new FrameworkPropertyMetadata
      {
        DefaultValue = FillRule.EvenOdd,
        PropertyChangedCallback = OnGeometryChanged,
        AffectsRender = true,
      });
    
      public bool CloseFigure { get { return (bool)GetValue(CloseFigureProperty); } set { SetValue(CloseFigureProperty, value); } }
      public static readonly DependencyProperty CloseFigureProperty = DependencyProperty.Register("CloseFigure", typeof(bool), typeof(ViewboxPolyline), new FrameworkPropertyMetadata
      {
        DefaultValue = false,
        PropertyChangedCallback = OnGeometryChanged,
        AffectsRender = true,
      });
    
      protected override Geometry  ComputeDefiningGeometry()
      {
        PointCollection points = Points;
        if(points.Count<2) return Geometry.Empty;
    
        var geometry = new StreamGeometry { FillRule = FillRule };
        using(var context = geometry.Open())
        {
          context.BeginFigure(Points[0], true, CloseFigure);
          context.PolyLineTo(Points.Skip(1).ToList(), true, true);
        }
        return geometry;
      }
    
    }
    
    public class ViewboxPolygon : ViewboxPolyline
    {
      static ViewboxPolygon()
      {
        CloseFigureProperty.OverrideMetadata(typeof(ViewboxPolygon), new FrameworkPropertyMetadata
        {
          DefaultValue = true,
        });
      }
    }
    

    Enjoy!

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am trying to understand how to use SyndicationItem to display feed which is
For some reason, after submitting a string like this Jack’s Spindle from a text
I'm trying to select an H1 element which is the second-child in its group
I have a text area in my form which accepts all possible characters from
Basically, what I'm trying to create is a page of div tags, each has
link Im having trouble converting the html entites into html characters, (&# 8217;) i
I have just tried to save a simple *.rtf file with some websites and
I used javascript for loading a picture on my website depending on which small
I have a string like this: La Torre Eiffel paragonata all&#8217;Everest What PHP function
I am trying to render a haml file in a javascript response like so:

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.