6

考虑以下 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 作为输入/输出时,有什么方法可以保留原始字体大小?

4

1 回答 1

7

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

在内部,当您FontSize="14pt"在 XAML 中指定类似内容时,WPFLengthConverter会根据与您提供的度量单位相关联的因素使用和更改限定的 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 转换器,它没有恼人的舍入错误。

于 2009-08-19T19:36:30.850 回答