如何使用Windows.Media.TextFormatting

时间:2018-04-19 15:52:42

标签: wpf mvvm text-formatting

我使用 System.Windows.Media.TextFormatting 类作为文本格式化引擎,为我的MVVM应用程序实现了文本编辑器控件。该模型定义的文本非常类似于HTML或XAML中的文本,有段落包含跨度和运行,跨度包含更多跨度等。视图模型公开文本状态更改的线性列表,并通过实现的适配器公开TextFormatting.TextSource 即可。然后, TextFormatter 将生成 TextLine 对象的集合,这些对象由视图中的自定义FrameWorkElement呈现。

到目前为止一切顺利。我可以做多种字体,大小,下划线,删除线,前景色和背景色。为了实现上标,我可以减小字体大小,然后在某个垂直偏移处绘制单个文本块。下划线只是在文本运行下绘制一条线的问题。

然而,我被卡住了,是字母间距和水平文字缩放。字母间距意味着文本运行中的每个字符都会添加一些额外的宽度。

可以指定文本效果来缩放或移动部分文本,但效果仅在渲染过程中应用,不会影响换行。缩放文本块将简单地与相邻文本重叠,并且其大小更改不用于计算行长度。

我可以在每个角色后面添加自定义标签,但这会混淆模型和视图索引的簿记。我将添加视图中但在模型中不存在的字符。向内容添加代码点也会混淆Unicode文本布局 - 代码点可能与字形无关,因此可能不那么容易。

我没有办法发布整个项目,但我创建了有限的 test application ,试图建立原始MVVM并从原始项目中复制一些部分。没有模型,我只是用硬编码元素填充页面viewmodel。

我已经在XAML中看到了letter spacing的建议解决方案,但在我的情况下,没有XAML。我将文本格式化为专有文档格式的一部分。

TextFormatting的文档非常简洁。深入研究Avalon文本编辑器代码有帮助,但我还没有看到其他人使用.NET的这一部分。

我完全接受这个问题远非明确,直到有人调查了示例应用程序或者之前有使用.net文本格式化API的经验时才会有意义。

如果没有别的,也许有人会发现代码示例即使没有字母间距也很有用;)

0 个答案:

没有答案