2009-07-21 47 views
6

时请考虑以下的RTF文档加载/保存RTF在WPF

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

+0

那么,我认为有一件事是可能的:1.从“RichTextBox”获取XAML; 2.对每个字体大小加上0.001来修改它; 3.使用代码(很容易找到)通过内置类将XAML转换为RTF。这样你就可以调整输入,所以你的输出就是你想要的。 – 2009-08-23 18:55:41

回答

6

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

在内部,当您在XAML中指定类似FontSize="14pt"之类的内容时,WPF使用LengthConverter并基于与您给出的度量单位关联的因子更改该限定的double值。所以11大约乘以1.3333333。因此,如果将简单double值输入到FontSize属性,则该单位是像素。但是,如果使用FontSize="14.0001pt",或者将点乘以1.3333334,或者甚至可以将0.0001添加到像素测量中,它就会偏移恰好足够的值,以至于您实际获得的是\ fs22或\ fs28(而不是\ fs21或\ fs28),而不是\ fs21或\ fs28。 fs27)。这是当你在WPF中设置大小的时候。

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

也许这个信息会给你一个想法如何获得不同的RTF。也许你可以取而代之将XAML转换出来。也许有一个很好的免费的第三方XAML到RTF转换器,它没有恼人的舍入错误。

+0

问题的好解释。与此同时,我正在寻找这样的第三方组件。唉,不是很成功。 – 2009-08-23 14:20:27