Я нашел полу-решение, и я думал, что поделюсь, так как эта проблема нигде в Интернете не решена, и я думаю, что многие люди имеют проблемы с ним.
Я установил переменную NewInput в конструкторе. Когда будет запущен первый вход в richTextBox, я просто применю к нему все необходимые форматы и передам его элементу управления.
private bool NewInput;
private void richTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (NewInput)
{
richTxt.BeginChange();
TextPointer startPosition = richTxt.Selection.Start;
Run r = new Run(e.Text, startPosition);
if (IsSelectionBold)
{
r.FontWeight = FontWeights.Bold;
}
if (IsSelectionItalic)
{
r.FontStyle = FontStyles.Italic;
}
if (IsSelectionUnderlined)
{
r.TextDecorations = TextDecorations.Underline;
}
r.FontSize = double.Parse(SelectedFontHeight);
r.FontFamily = new FontFamily(SelectedFont);
richTxt.EndChange();
NewInput = false;
e.Handled = true;
richTxt.CaretPosition = richTxt.CaretPosition.GetPositionAtOffset(1);
}
}
Затем я заменяю каретку в нужном месте. Таким образом, форматирование сохраняется, даже если в RichTextBox ничего нет.
Я уверен, что однажды это кому-нибудь поможет.