将一个FlowDocument复制到另一个FlowDocument

9
我该如何将一个FlowDocument的内容复制到另一个FlowDocument中?以下是我尝试过的方法:
foreach (var blk in fd1.Blocks)
{
   fd2.Blocks.Add(blk);
}

fd1是FlowDocument1,fd2是FlowDocument2。

但是我收到了以下错误信息:

集合已修改;枚举操作可能无法执行。

谢谢

Arvind

2个回答

8
由于每个块都是“归属于” FlowDocument 的,所以它不能被直接添加到另一个文档中。您必须将其序列化,然后反序列化,这会断开与原始 FlowDocument 的联系,并允许您将其添加到另一个文档中。
/// <summary>
/// Adds one flowdocument to another.
/// </summary>
/// <param name="from">From.</param>
/// <param name="to">To.</param>
public static void AddDocument(FlowDocument from, FlowDocument to)
{
    TextRange range = new TextRange(from.ContentStart, from.ContentEnd);
    MemoryStream stream = new MemoryStream();
    System.Windows.Markup.XamlWriter.Save(range, stream);
    range.Save(stream, DataFormats.XamlPackage);
    TextRange range2 = new TextRange(to.ContentEnd, to.ContentEnd);
    range2.Load(stream, DataFormats.XamlPackage);
}

这是从以下位置复制的:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/f4b26d9b-5b74-446b-85e7-e49e519380ad


1

补充一下答案,如果你想移动而不是复制:

你不能只向目标文档添加元素,因为这样它们将存在于两个文档中 - 所以你需要先从源文档中删除它们。

using System.Linq;
...

var blockList = source.Blocks.ToList();
foreach (var block in blockList)
{
    source.Blocks.Remove(block);
    dest.Blocks.Add(block);
}

(实现说明:我们首先将要处理的块的引用放入单独的列表中,以避免在 foreach 中枚举 source.Blocks 列表时更改它)

作为额外的选项,你可以只缓存这些块,然后清除原始源。 然后,只需使用AddRange()方法将它们添加到目标中。 var blocks = source.Blocks.ToArray(); source.Blocks.Clear(); dest.Blocks.AddRange(blocks); - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接