如何声明GlyphRun对象?绘制数字需配置哪些属性?
问题解答
不行,只设置Characters和FontRenderingEmSize不足以创建有效的GlyphRun对象。GlyphRun依赖字体的字形核心信息(比如字形索引、宽度度量等),直接赋值字符列表无法让系统正确解析并完成渲染。
要绘制字符串“123”,你需要先获取目标字体的GlyphTypeface,将字符映射为对应的字形索引,同时指定每个字形的宽度。以下是修正后的可运行代码:
// 指定要使用的字体路径(以系统默认Segoe UI为例) var fontPath = @"C:\Windows\Fonts\segoeui.ttf"; var glyphTypeface = new GlyphTypeface(new Uri(fontPath)); string targetText = "123"; double emSize = 20; // 存储字形索引与宽度的列表 List<ushort> glyphIndices = new List<ushort>(); List<double> advanceWidths = new List<double>(); foreach (char c in targetText) { // 把字符转换为对应字体的字形索引 if (glyphTypeface.CharacterToGlyphMap.TryGetValue(c, out ushort glyphIndex)) { glyphIndices.Add(glyphIndex); // 根据EmSize缩放字形宽度,保证间距正确 double scaledWidth = glyphTypeface.AdvanceWidths[glyphIndex] * emSize; advanceWidths.Add(scaledWidth); } } // 创建完整的GlyphRun实例 var gr = new GlyphRun( glyphTypeface: glyphTypeface, bidiLevel: 0, isSideways: false, renderingEmSize: emSize, glyphIndices: glyphIndices, baselineOrigin: new Point(0, 0), advanceWidths: advanceWidths, glyphOffsets: null, characters: targetText.ToList(), deviceFontName: null, clusterMap: null, caretStops: null, language: XmlLanguage.GetLanguage("en-US") ); // 生成可用于绘制的GlyphRunDrawing var glyphDrawing = new GlyphRunDrawing(Brushes.Black, gr);
关键说明:
GlyphTypeface:必须指定具体字体文件路径,它提供了字符到字形的映射关系、字形宽度等核心度量数据。glyphIndices:每个字符在对应字体中的唯一字形索引,不同字体的字形索引可能存在差异。advanceWidths:每个字形的实际显示宽度,需要结合FontRenderingEmSize缩放,确保字符间的间距符合预期。
你原代码的错误在于仅赋值了Characters,缺少GlyphTypeface、glyphIndices和advanceWidths这些核心参数,导致GlyphRun无法被系统正确识别和渲染。
内容的提问来源于stack exchange,提问作者Korshunov Vladimir
相关产品推荐
相关产品推荐

