WPF中无法将GlyphRunDrawing加入GeometryGroup?如何添加文本?
解答
1. 错误产生的原因
GeometryGroup的Children集合仅接受**Geometry派生类**的对象,而GlyphRunDrawing属于Drawing类的分支,和Geometry是完全独立的继承体系:
EllipseGeometry继承自Geometry,符合GeometryGroup的类型要求GlyphRunDrawing继承自Drawing,无法转换为Geometry类型,因此添加时触发类型不匹配错误
2. 在GeometryGroup中添加文本的方法
GeometryGroup只能容纳Geometry对象,因此需要将文本转换为文本几何图形,推荐两种实现方式:
方式一:使用FormattedText生成文本几何(简单易用)
通过FormattedText定义文本的内容、字体、大小等样式,再调用BuildGeometry()方法生成对应的Geometry对象,直接加入GeometryGroup:
// 创建圆形几何 var circleGeo = new EllipseGeometry(new Rect(new Point(0, 0), new Point(100, 100))); // 创建文本并转换为几何 var formattedText = new FormattedText( "示例文本", System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Brushes.Black); // 设置文本位置(居中显示在圆形内) var textGeo = formattedText.BuildGeometry(new Point(35, 45)); // 组合几何 var geometryGroup = new GeometryGroup(); geometryGroup.Children.Add(circleGeo); geometryGroup.Children.Add(textGeo); // 创建DrawingImage并赋值给Image var geometryDrawing = new GeometryDrawing(Brushes.LightBlue, new Pen(Brushes.Black, 1), geometryGroup); var drawingImage = new DrawingImage(geometryDrawing); myImage.Source = drawingImage;
方式二:使用GlyphRunGeometry(基于GlyphRun的底层实现)
如果需要基于GlyphRun实现,需使用GlyphRunGeometry(它是Geometry的派生类)替代GlyphRunDrawing,示例代码:
// 创建圆形几何 var circleGeo = new EllipseGeometry(new Rect(new Point(0, 0), new Point(100, 100))); // 构建GlyphRun(需指定字体、字形索引等参数) var typeface = new Typeface("Arial"); GlyphTypeface glyphTypeface; if (!typeface.TryGetGlyphTypeface(out glyphTypeface)) throw new InvalidOperationException("无法获取字形信息"); var glyphIndices = new ushort[] { glyphTypeface.CharacterToGlyphMap['A'] }; var advanceWidths = new double[] { glyphTypeface.AdvanceWidths[glyphIndices[0]] }; var glyphRun = new GlyphRun( glyphTypeface, 0, false, 12, glyphIndices, new Point(40, 50), advanceWidths, null, null, null, null, null, null); // 创建GlyphRunGeometry并加入Group var textGeo = new GlyphRunGeometry(glyphRun); var geometryGroup = new GeometryGroup(); geometryGroup.Children.Add(circleGeo); geometryGroup.Children.Add(textGeo); // 创建DrawingImage并赋值 var geometryDrawing = new GeometryDrawing(Brushes.LightBlue, new Pen(Brushes.Black, 1), geometryGroup); var drawingImage = new DrawingImage(geometryDrawing); myImage.Source = drawingImage;
内容的提问来源于stack exchange,提问作者Korshunov Vladimir
相关产品推荐
相关产品推荐

