2010-03-03 48 views
9

我正在构建一个应用程序,需要允许用户在另一个插入位置的当前插入位置插入文本RichTextBox。我花了很多时间很多胡闹与FlowDocument的对象模型跨越这个技术运行前 - sourcetarget都是FlowDocument S:如何将内联内容从一个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); 
} 

这工作得非常好。

我现在唯一遇到的问题是,它始终将源文件作为新段落插入。它会打断插入符的当前运行(或其他),插入源代码并结束段落。如果源实际上是的一段(或多个段落),但如果它仅仅是(比如说)一行文本则不适用。

我认为这很可能是最终检查目标,看它是否完全由一个块组成,如果是,请将TextRange设置为指向开头和结尾处的块的内容保存到流之前。

FlowDocument的整个世界对我来说都是一片黑暗的奥秘。如果必须的话,我可以成为这方面的专家(根据陀思妥耶夫斯基:“人是可以适应任何事情的动物)”,但如果有人已经知道了这一点,并可以告诉我如何做到这一点,生活容易得多。

回答

12

您的直接问题是您正在使用TextFormat.Xaml而不是TextFormat.XamlPackage

控制合并文档时是否合并行的属性是Section.HasTrailingParagraphBreakOnPaste属性。此属性为仅在加载或保存XamlPackage文本格式时生效。当使用Xaml文本格式时,该属性在Save()期间被省略,并在Load()期间被忽略。

所以简单的解决方法是简单地改变加载和保存电话:

tr.Save(ms, DataFormats.XamlPackage); 
ms.Seek(0, SeekOrigin.Begin); 
tr = new TextRange(target.CaretPosition, target.CaretPosition); 
tr.Load(ms, DataFormats.XamlPackage); 

注意,这也解决了另一个问题,你最终会遇到:使用DataFormats.Xaml当嵌入式位图就不能正确地复制,因为那里无处可放图像位。随着DataFormats.XamlPackage整个包建立,所以位图和其他包装项目会遇到好的。

一旦你做了这个改变,你可能会发现另一个事实,可能会或可能不是你的问题:你的示例代码使用document.ContentStartdocument.ContentEnd。如果这是您的实际代码,您会发现从document.ContentStartdocument.ContentEnd之间的任何范围都必须包含完整段落,因此复制它总是会在插入结束时插入段落分隔符。如果这是一个问题,使用类似RichTextBox.Selection(如果这是UI驱动的),或者使用TextPointer隐含的段落标记前备份ContentEnd,例如:

var tr = new TextRange(document.ContentStart, 
         document.ContentEnd.GetInsertionPosition(
                LogicalDirection.Backward)); 
+0

这将需要一段时间之前,我其实可以去检查这是否正确,但它确定好像你已经到了我现在所在的位置,我很欣赏这些信息。 – 2010-03-24 07:29:27

相关问题