You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:16:10