2009-07-21 44 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