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

Sve*_*ler 6 wpf rtf font-size flowdocument

请考虑以下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
}
Run Code Online (Sandbox Code Playgroud)

它包含字体Segoe UI 11 pt中的"Sample Text".现在,当我分别使用WPF的FlowDocument和TextRange.Load()和.Save()加载然后保存文档时,字体大小减小到10.5pt.使用RTF作为输入/输出时,有没有办法保留原始字体大小?

Joe*_*ant 6

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

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

但是,如果您使用FontSize="14.0001pt"或将这些点乘以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转换器没有恼人的舍入错误.