如何使用 WPF 中的 TextShape 类绘制自定义形状?

Posted

技术标签:

【中文标题】如何使用 WPF 中的 TextShape 类绘制自定义形状?【英文标题】:How to draw a customized shape using TextShape Class in WPF? 【发布时间】:2016-09-24 15:35:32 【问题描述】:

需要使用 TextShape 类来绘制形状。基本上想在继承自 RectangleBase 的 TextShape 类中覆盖 drawingContext.DrawRoundedRectangle() 方法。

这是我从 WPFTutorial.net 获得的以下代码。这是链接:

http://www.wpftutorial.net/DrawRoundedRectangle.html

    public void DrawRoundedRectangleMine(DrawingContext dc, Brush brush, Pen pen, Rect rect, CornerRadius cornerRadius)
    
        var geometry = new StreamGeometry();
        using (var context = geometry.Open())
        
            bool isStroked = pen != null;
            const bool isSmoothJoin = true;

            context.BeginFigure(rect.TopLeft + new Vector(0, cornerRadius.TopLeft), brush != null, true);
            context.ArcTo(new Point(rect.TopLeft.X + cornerRadius.TopLeft, rect.TopLeft.Y),
                new Size(cornerRadius.TopLeft, cornerRadius.TopLeft),
                40, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
            context.LineTo(rect.TopRight - new Vector(cornerRadius.TopRight, 0), isStroked, isSmoothJoin);
            context.ArcTo(new Point(rect.TopRight.X, rect.TopRight.Y + cornerRadius.TopRight),
                new Size(cornerRadius.TopRight, cornerRadius.TopRight),
                40, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
            context.LineTo(rect.BottomRight - new Vector(0, cornerRadius.BottomRight), isStroked, isSmoothJoin);
            context.ArcTo(new Point(rect.BottomRight.X - cornerRadius.BottomRight, rect.BottomRight.Y),
                new Size(cornerRadius.BottomRight, cornerRadius.BottomRight),
                40, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
            context.LineTo(rect.BottomLeft + new Vector(cornerRadius.BottomLeft, 0), isStroked, isSmoothJoin);
            context.ArcTo(new Point(rect.BottomLeft.X, rect.BottomLeft.Y - cornerRadius.BottomLeft),
                new Size(cornerRadius.BottomLeft, cornerRadius.BottomLeft),
                40, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);

            context.Close();
        
        dc.DrawGeometry(brush, pen, geometry);
    

想要实现如下形状: 1) 2)

基本上我必须在第一个中创建两个形状,它将是一个右侧有弧的矩形。在第二种形状中,它也将是一个矩形,但左侧是一个弧形。

请帮助我如何在 .cs 类中使用 DrawRoundedRectangleMine() 创建它。不在 xaml 中。谢谢。

【问题讨论】:

RectangleBase 类是什么? 它是一个自定义基类,我们在其中保留了一些属性以在子类中使用。但这在绘制实际几何图形时并没有多大作用。主要方法是drawingContext.DrawRoundedRectangle(FillBrush, BorderPen, new Rect(this.Left, this.Top, this.Right - this.Left, this.Bottom - this.Top), CornerRadius, CornerRadius);但是我们必须重写此方法,以便我们可以根据需要绘制形状,即如上图所示。谢谢! 【参考方案1】:

这是你要求的吗:

    protected override void OnRender (DrawingContext drawingContext)
    
        double radius = RenderSize.Height / 2;

        var sg = new StreamGeometry ();
        using (var ctx = sg.Open ())
        
            ctx.BeginFigure (new Point(0, 0), true, true);
            ctx.LineTo (new Point(RenderSize.Width - radius, 0), true, false);
            ctx.ArcTo (new Point (RenderSize.Width - radius, RenderSize.Height), new Size (radius, radius), 0, true, SweepDirection.Clockwise, true, false);
            ctx.LineTo (new Point(0, RenderSize.Height), true, false);
        

        var pen = new Pen (Stroke, StrokeThickness);

        drawingContext.DrawGeometry (Fill, pen, sg);
    

这几行准确地绘制了此处描述的环境中的第一个形状:

How do I get my WPF Custom shape class to render in desiger?

【讨论】:

感谢您的回复。

以上是关于如何使用 WPF 中的 TextShape 类绘制自定义形状?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中如何使用图像API进行绘制

C#wpf里面怎么绘制线条

WPF学习第四十四章 图画

WPF学习第四十四章 图画

如何在 WPF 中绘制“软”线(可能使用 LinearGradientBrush)?

WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本