开发者

Draw a filled triangle in DrawingContext

开发者 https://www.devze.com 2023-02-06 00:16 出处:网络
This is a follow up from this question. Question: I am trying to draw a filled triangle using DrawingContext, which is rendered on a DrawingVisual

This is a follow up from this question.

Question:

I am trying to draw a filled triangle using DrawingContext, which is rendered on a DrawingVisual

Currently, I have managed to draw the outline of a triangle using the following C# code:

private DrawingVisual CreateTriangle()
  {
     DrawingVisual triangle = new DrawingVisual();
     using ( DrawingContext dc = triangle.RenderOpen() )
     {
         Pen drawingPen = new Pen(Brushes.Black,3);
         dc.D开发者_如何转开发rawLine(drawingPen, new Point(0, 50), new Point(50, 0));
         dc.DrawLine(drawingPen, new Point(50, 0), new Point(50, 100));
         dc.DrawLine(drawingPen, new Point(50, 100), new Point(0, 50));

     }
     return triangle;
  }

I get this:

Draw a filled triangle in DrawingContext

How do I draw a triangle that, in addition to th border I have drawn also has a red fill?

Draw a filled triangle in DrawingContext


Use dc.DrawGeometry to create filled-in shapes.

Edit: This:

private DrawingVisual CreateTriangle()
{
    var triangle = new DrawingVisual();
    using (DrawingContext dc = triangle.RenderOpen())
    {
       var start = new Point(0, 50);

       var segments = new []
       { 
          new LineSegment(new Point(50,0), true), 
          new LineSegment(new Point(50, 100), true)
       };

       var figure = new PathFigure(start, segments, true);
       var geo = new PathGeometry(new [] { figure });
       dc.DrawGeometry(Brushes.Red, null, geo);

       var drawingPen = new Pen(Brushes.Black, 3);
       dc.DrawLine(drawingPen, new Point(0, 50), new Point(50, 0));
       dc.DrawLine(drawingPen, new Point(50, 0), new Point(50, 100));
       dc.DrawLine(drawingPen, new Point(50, 100), new Point(0, 50));   
    }

    return triangle;
}

On a side note, if you have to create the PathGeometry anyway and you use DrawGeometry you might as well stroke it too, then you don't need your original line drawings.

dc.DrawGeometry(Brushes.Red, new Pen(Brushes.Black, 3), geo);


Maybe a bit old but it might help somebody else. Instead of using PathGeometry it uses Stream geometry. "This geometry is light-weight alternative to PathGeometry"

Point p1 = new Point(0, 50);
Point p2 = new Point(50, 0);
Point p3 = new Point(50, 100);
StreamGeometry streamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = streamGeometry.Open())   
{
    geometryContext.BeginFigure(p1, true, true);
    PointCollection points = new PointCollection{ p2, p3 };
    geometryContext.PolyLineTo(points, true, true);
}

streamGeometry.Freeze();
context.DrawGeometry(Brushes.Red, new Pen(Brushes.Black,3), streamGeometry);

More info about StreamGeometry here: https://msdn.microsoft.com/en-us/library/system.windows.media.streamgeometry.aspx

Regards.

0

精彩评论

暂无评论...
验证码 换一张
取 消