我正在使用DrawingContext DrawGlyphRun(GlyphRun)函数使用https://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/中的解决方案在Canvas中绘制文本。
我在FormattedText上使用它,因为它更快,它也用于计算文本宽度。
除了2个问题之外,这很有效:
字符问题似乎是GlyphTypeface.CharacterToGlyphMap无法找到jp或cn字符,所以我不确定如何处理这些字符。
答案 0 :(得分:1)
在我做了一些研究之后,我刚刚找到了你的问题。
使用公共构造函数创建的GlyphRun创建具有TextFormattingMode = Ideal
所有WPF控件的rendring使用方法/构造函数接受TextFormattingMode作为参数。
您可以通过反射调用GlyphRun.TryCreate()
静态方法:
internal static GlyphRun TryCreate(
GlyphTypeface glyphTypeface,
int bidiLevel,
bool isSideways,
double renderingEmSize,
IList<ushort> glyphIndices,
Point baselineOrigin,
IList<double> advanceWidths,
IList<Point> glyphOffsets,
IList<char> characters,
string deviceFontName,
IList<ushort> clusterMap,
IList<bool> caretStops,
XmlLanguage language,
TextFormattingMode textLayout
)
但是您需要advanceWidths
获取TextFormattingMode = Ideal
的问题。为此,您需要通过反射访问GlyphTypeface
类提供的内部方法。
GlyphTypeface.AdvanceWidths
属性在内部调用
internal double GetAdvanceWidth(ushort glyph, TextFormattingMode textFormattingMode, bool isSideways)
使用textFormattingMode = TextFormattingMode.Ideal
您可以下载.Net源代码并自行检查。
关于你的第二个问题,我认为你使用chars而不是unicode代码点来获得字形索引。