私は、ユーザーがRichTextBox
現在のキャレット位置にあるテキストを別の場所に挿入できるようにする必要があるアプリケーションを構築しています。この手法に出くわす前に、のオブジェクトモデルをいじくり回すのに多くの時間を費やしましたが、どちらも次のようになります。FlowDocument
source
target
FlowDocument
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);
}
これは非常にうまく機能します。
私が今抱えている唯一の問題は、常にソースを新しい段落として挿入することです。カレットで現在の実行(またはその他)を中断し、ソースを挿入して、段落を終了します。これは、ソースが実際に1段落(または複数の段落)である場合は適切ですが、(たとえば)1行のテキストである場合は適切ではありません。
これに対する答えは、ターゲットが完全に単一のブロックで構成されているかどうかを確認し、そうである場合はTextRange
、ブロックのコンテンツの最初と最後を指すように設定してから保存することになる可能性が高いと思います。ストリームに。
の全世界はFlowDocument
私にとって暗い謎のうねる海です。必要に応じて私はそれの専門家になることができます(ドストエフスキーによると:「人は何にでも慣れることができる動物です。」)が、誰かがすでにこれを理解していて、これを行う方法を教えてくれるなら、それは私の人生ははるかに簡単です。