我正在构建一个应用程序,需要允许用户在另一个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);
}
这个功能运行得非常好。
我现在唯一遇到的问题是它总是将源代码作为新段落插入。它会在插入源代码时打断当前运行(或任何其他东西),然后结束段落。如果源代码只是一行文本,而不是(比如)一整段文本,那么这样做就不合适了。
我认为解决方法可能是检查目标是否完全由一个块组成,如果是,则在保存到流之前将设置为指向块内容的开头和结尾。
FlowDocument
的整个世界对我来说都是一个充满神秘的海洋。如果必须要的话,我可以成为它的专家(如同多斯托耶夫斯基所说:“人是可以适应任何事情的动物。”),但如果有人已经解决了这个问题并且可以告诉我如何做到这一点,那么我的生活将变得轻松得多。