Я создаю приложение, которое должно позволить пользователю вставлять текст из одного RichTextBox
в текущей позиции каретки в другой. Я потратил много времени на изучение объектной модели FlowDocument
перед тем, как перейти к этой технике - source
и target
оба FlowDocument
s:
using (MemoryStream ms = new MemoryStream())
{
TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);
tr.Save(ms, DataFormats.Xaml);
ms.Seek(0, SeekOrigin.Begin);
tr = new TextRange(target.CaretPosition, target.CaretPosition);
tr.Load(ms, DataFormats.Xaml);
}
Это работает замечательно хорошо.
Единственная проблема, с которой я столкнулся сейчас, заключается в том, что он всегда вставляет источник в виде нового абзаца. Он прерывает текущий прогон (или что-то еще) в каретке, вставляет источник и заканчивает абзац. Это уместно, если источник на самом деле является абзацем (или более чем одним абзацем), но не если это просто (скажем) строка текста.
Я думаю, что ответом на это, вероятно, будет проверка цели, чтобы увидеть, состоит ли она целиком из одного блока, и если это так, установка TextRange
для указания на начало и конец содержимое блока перед сохранением в потоке.
Весь мир FlowDocument
для меня - это волнующее море темных тайн. Я могу стать экспертом в этом, если мне придется (по Достоевскому: «Человек - это животное, которое может привыкнуть ко всему»), но если кто-то уже понял это и может сказать мне, как это сделать, это сделало бы меня жизнь намного проще.