如何使用 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 类绘制自定义形状?的主要内容,如果未能解决你的问题,请参考以下文章