在 WPF 中加载/保存 RTF 时保留字体大小

Posted

技术标签:

【中文标题】在 WPF 中加载/保存 RTF 时保留字体大小【英文标题】:Retaining font size when loading/saving RTF in WPF 【发布时间】:2010-11-12 16:08:28 【问题描述】:

考虑以下 RTF 文档

\rtf1\ansi\ansicpg1252\deff0\deflang1031\fonttbl\f0\fswiss\fprq2\fcharset0 Segoe UI;\f1\fswiss\fcharset0 Arial;
\*\generator Msftedit 5.41.15.1507;\viewkind4\uc1\pard\f0\fs22 Sample Text\f1\fs20\par

它包含 Segoe UI 11 pt 字体中的“示例文本”。现在,当我分别使用 WPF 的 FlowDocument 和 TextRange.Load() 和 .Save() 加载并保存文档时,字体大小减小到 10.5pt。使用 RTF 作为输入/输出时,有什么办法可以保留原来的字体大小?

【问题讨论】:

嗯,我认为可能的一件事是:1. 从RichTextBox 获取 XAML; 2.修改为每个字号加0.001; 3. 使用代码(很容易找到)通过内置类将 XAML 转换为 RTF。这样你就可以调整输入,这样你的输出就是你想要的。 【参考方案1】:

WPF 的所有测量值都以像素为单位(尽管不完全是屏幕像素)。即使您指定TextRangeFontSize

在内部,当您在 XAML 中指定 FontSize="14pt" 之类的内容时,WPF 使用 LengthConverter 并根据与您提供的测量单位相关联的因素更改限定的 double。所以 11 大约乘以 1.3333333。因此,如果您将一个普通的 double 值提供给 FontSize 属性,则单位是像素。

但是,如果您使用FontSize="14.0001pt",或将这些点乘以 1.3333334,或者甚至只是将 0.0001 添加到像素测量值,它会抵消一些东西,以至于您实际上得到 \fs22 或 \fs28(而不是 \fs21 或\fs27,分别)。这是在您在 WPF 中设置大小时使用的。

你有 \fs22、Load()、Save(),然后有 \fs21 的原因与同样的事情有关。解析器获取 RTF 并将其转换为 WPF 对象。所以 22 个半点变成了 14.666666666667 像素。当您再次 Save() 时,这些像素会转换回不同的单位,但不是很正确。 14.666666666667 像素变成了 21 个半点,而 14.6666674 像素变成了 22 个半点,这就是你想要的。

也许这些信息会让您了解如何以不同的方式获取 RTF。也许您可以改为获取 XAML 并将其转换。也许有一个不错的免费第三方 XAML 到 RTF 转换器,它没有令人讨厌的舍入错误。

【讨论】:

很好地解释了这个问题。与此同时,我正在四处寻找这样的第三方组件。唉,没有太大的成功。

以上是关于在 WPF 中加载/保存 RTF 时保留字体大小的主要内容,如果未能解决你的问题,请参考以下文章

无法在 WPF 项目中加载 DLL

每次我在 WPF 中加载时如何使 Listbox 的 ScrollViewer 滚动到顶部

在 CSS 中加载 @font-face 时如何删除浏览器中的默认字体? “FOUT”

将 Ink Canvas StrokeCollection 保存到流/从流中加载

VC6.0中加载图片并实现放大功能

WPF:在 UserControl 的构造函数中加载数据会破坏设计器