开发者

Copying one FlowDocument to Second FlowDocument

开发者 https://www.devze.com 2022-12-13 00:11 出处:网络
How can i copy the contents of one FlowDocument to another FlowDocument below is what i tryed foreach (var blk in fd1.Blocks)

How can i copy the contents of one FlowDocument to another FlowDocument below is what i tryed

foreach (var blk in fd1.Blocks)
{
   fd2.Blocks.Add(blk);
}

fd1 is FlowDocument1 and fd2 is FlowDocument2.

But i get the below error.

Collection was modified; enumeration operation m开发者_如何转开发ay not execute.

Thanks

Arvind


Because each Block is 'owned' by a FlowDocument, it cannot just be added to another. You must serialize it and then deserialize it, which breaks the bond with the original FlowDocument, which allows you to add it to another.

/// <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);
}

This was copied from:

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


Just to add to the answer, if you want to move rather than copy:

You can't just add elements to the destination document, as then they will be in both documents - so you need to remove them from the source document first.

using System.Linq;
...

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

(Implementation note: We put references to the blocks to process into a separate list first to avoid changing the source.Blocks list while enumerating it in the foreach)

0

精彩评论

暂无评论...
验证码 换一张
取 消