2009-07-21 3 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 
} 

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

+0

Ну, одна вещь, которую я рассматривал как возможность, такова: 1. Получить XAML из «RichTextBox»; 2. Измените его, добавив 0.001 к каждому размеру шрифта; 3. Используйте код (легко найти), чтобы преобразовать XAML в RTF со встроенными классами. Таким образом, вы настраиваете ввод, чтобы ваш результат был тем, что вы хотите. –

ответ

6

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

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

+0

Хорошее объяснение проблемы. Тем временем я искал такой сторонний компонент. Увы, не с большим успехом. –