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

时间:2009-07-21 14:27:26

标签: wpf rtf flowdocument font-size

考虑以下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中的“Sample Text”。现在,当我分别使用WPF的FlowDocument和TextRange.Load()和.Save()加载然后保存文档时,字体大小减小到10.5pt。使用RTF作为输入/输出时,有没有办法保留原始字体大小?

1 个答案:

答案 0 :(得分:6)

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

也是如此

在内部,当您在XAML中指定TextRange之类的内容时,WPF会使用FontSize="14pt"并根据与您提供的度量单位关联的因子更改该限定倍数。因此,11大约乘以1.3333333。因此,如果将纯双精度值提供给LengthConverter属性,则单位为像素。

但是,如果您使用FontSize,或者将这些点乘以1.3333334,或者甚至只是将0.0001添加到像素测量值,它会使事情偏移到实际得到的\ fs22或\ fs28(而不是\分别为fs21或\ fs27)。这适用于在WPF中设置大小的时候。

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

也许这些信息会让您了解如何以不同方式获得RTF。也许你可以将XAML取出并转换它。也许有一个很好的免费的第三部分XAML到RTF转换器没有恼人的舍入错误。