2009-07-21 7 views
6

Halte beim Laden/Speichern RTF in 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 
} 

folgendes RTF-Dokument in Betracht. Wenn ich jetzt das Dokument mit WPF FlowDocument und TextRange.Load() bzw. .Save() lade und dann speichere, wird die Schriftgröße auf 10,5pt reduziert. Gibt es eine Möglichkeit, die ursprüngliche Schriftgröße beizubehalten, wenn RTF als Eingabe/Ausgabe verwendet wird?

+0

Nun, eine Sache, die ich als eine Möglichkeit betrachtete, war diese: 1. Holen XAML von der RichTextBox; 2. Ändern Sie es, indem Sie jeder Schriftgröße 0,001 hinzufügen; 3. Verwenden Sie Code (leicht zu finden), um XAML mit den integrierten Klassen in RTF zu konvertieren. Auf diese Weise optimieren Sie die Eingabe so, dass Ihre Ausgabe genau Ihren Vorstellungen entspricht. –

Antwort

6

Alle WPF Messungen sind in Pixel (obwohl nicht genau Bildschirmpixel). Auch wenn Sie die FontSize eines TextRange angeben.

Intern, wenn Sie in XAML beispielsweise FontSize="14pt" angeben, verwendet WPF LengthConverter und ändert dieses qualifizierte doppelte basierend auf einem Faktor, der der von Ihnen angegebenen Maßeinheit zugeordnet ist. Also wird 11 ungefähr mit 1,3333333 multipliziert. Wenn Sie also einer FontSize Eigenschaft einen einfachen Doppelwert zuführen, ist die Einheit Pixel. Wenn Sie FontSize="14.0001pt" verwenden oder die Punkte mit 1,3333334 multiplizieren, oder vielleicht sogar nur 0,0001 zur Pixelmessung hinzufügen, werden die Dinge gerade so weit verschoben, dass Sie tatsächlich \ fs22 oder \ fs28 erhalten (statt \ fs21 oder \). fs27, jeweils). Dies ist der Fall, wenn Sie eine Größe in WPF festlegen.

Der Grund, warum Sie \ fs22, Load(), Save() und have \ fs21 haben, hat mit der gleichen Sache zu tun. Ein Parser übernimmt die RTF und konvertiert sie in WPF-Objekte. So werden 22 Halbpunkte zu etwas wie 14,666666666667 Pixeln. Wenn Sie erneut speichern(), werden diese Pixel wieder in eine andere Einheit konvertiert, aber nicht sehr korrekt. 14.6666666666667 Pixel werden 21 halbe Punkte, aber 14.6666674 Pixel werden 22 halbe Punkte, was Sie wollten.

Vielleicht geben Ihnen diese Informationen eine Idee, wie Sie RTF anders bekommen. Vielleicht können Sie stattdessen XAML herausbekommen und es konvertieren. Vielleicht gibt es einen schönen kostenlosen XAML-to-RTF Konverter, der keine störenden Rundungsfehler hat.

+0

Gute Erklärung des Problems. In der Zwischenzeit suchte ich nach einer solchen Komponente von Drittanbietern. Leider nicht mit viel Erfolg. –