Сохранение размера шрифта при загрузке / сохранении RTF в WPF - PullRequest
6 голосов
/ 21 июля 2009

Рассмотрим следующий документ 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
}

Содержит «Sample Text» в шрифте Segoe UI 11 pt. Теперь, когда я загружаю, а затем сохраняю документ, используя FlowFocument и TextRange.Load () и .Save () WPF соответственно, размер шрифта уменьшается до 10,5pt. Есть ли способ сохранить исходный размер шрифта при использовании RTF в качестве ввода / вывода?

1 Ответ

6 голосов
/ 19 августа 2009

Все измерения WPF выражены в пикселях (хотя не в точках экрана). Даже когда вы указываете FontSize из TextRange.

Внутренне, когда вы указываете что-то вроде FontSize="14pt" в XAML, WPF использует LengthConverter и изменяет это удвоенное значение на основе коэффициента, связанного с единицей измерения, которую вы даете. Таким образом, 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 третьей части, который не имеет досадных ошибок округления.

...