2009-07-21 12 views
6

Rozważmy następujący dokument RTFustalający rozmiar czcionki podczas ładowania/zapisywania RTF w 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 
} 

Zawiera "przykładowy tekst" czcionką Segoe UI 11 pt. Teraz, kiedy ładuję, a następnie zapisuję dokument, odpowiednio przy użyciu funkcji FlowDocument i TextRange.Load() i .Save(), rozmiar czcionki zostanie zmniejszony do 10,5 punktu. Czy jest jakiś sposób na zachowanie oryginalnego rozmiaru czcionki podczas używania RTF jako wejścia/wyjścia?

+0

Cóż, jedna rzecz, którą rozważałem jako możliwość, była następująca: 1. Pobierz XAML z 'RichTextBox'; 2. Zmodyfikuj go, dodając 0,001 do każdego rozmiaru czcionki; 3. Użyj kodu (łatwo znaleźć), aby przekonwertować XAML na RTF z wbudowanymi klasami. W ten sposób poprawiasz dane wejściowe, dzięki czemu Twoje wyniki są zgodne z oczekiwaniami. –

Odpowiedz

6

Wszystkie pomiary WPF są w pikselach (chociaż nie są to piksele ekranu). Nawet jeśli podasz FontSize z FontSize z FontSize.

Wewnętrznie, podając w XAML coś takiego jak FontSize="14pt", WPF używa LengthConverter i zmienia podwójne kwalifikacje w oparciu o współczynnik związany z podaną jednostką miary. Więc 11 zostaje pomnożone przez około 1,3333333. Jeśli więc podasz zwykłą podwójną wartość do właściwości FontSize, jednostką są piksele.

Jeśli jednak użyjesz FontSize="14.0001pt" lub pomnożysz punkty przez 1.3333334, a może po prostu dodasz 0,0001 do pomiaru pikseli, to przesunie on rzeczy na tyle, że faktycznie uzyskasz \ fs22 lub \ fs28 (zamiast \ fs21 lub \ fs27, odpowiednio). Jest tak w przypadku ustawiania rozmiaru w WPF.

Powód, dla którego masz \ fs22, Load(), Save(), a następnie \ fs21 ma do czynienia z tym samym. Parser pobiera RTF i przekształca go w obiekty WPF. Tak więc 22 półprocentowe stają się czymś w rodzaju 14,666666666667 pikseli. Po ponownym zapisaniu() te piksele zostaną przekonwertowane z powrotem na inną jednostkę, ale niezbyt poprawnie. 14.666666666667 piksele stają się 21 punktami, ale 14,6666674 pikseli stają się 22 punktami, co jest tym, czego potrzebujesz.

Może ta informacja da ci pomysł, jak uzyskać RTF w inny sposób. Może zamiast tego możesz pobrać XAML i przekonwertować go. Może jest fajny darmowy konwerter XAML-to-RTF trzeciej części, który nie ma denerwujących błędów zaokrąglania.

+0

Dobre wyjaśnienie problemu. W międzyczasie rozglądałem się za takim komponentem innej firmy. Niestety, nie z dużym sukcesem. –