Все измерения WPF находятся в пикселях (хотя и не точно в пикселях экрана). Даже если вы укажете FontSize
TextRange
.
Внутренне, когда вы указываете что-то вроде 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 третьей части, который не имеет раздражающих ошибок округления.
Ну, одна вещь, которую я рассматривал как возможность, такова: 1. Получить XAML из «RichTextBox»; 2. Измените его, добавив 0.001 к каждому размеру шрифта; 3. Используйте код (легко найти), чтобы преобразовать XAML в RTF со встроенными классами. Таким образом, вы настраиваете ввод, чтобы ваш результат был тем, что вы хотите. –