将列表复制到 Flowdocument 弄乱了第一个列表项

Copy list to Flowdocument messes up 1st listitem

我正在编写一个扩展程序,允许用户将多个笔记合并为一个笔记,并提供一些功能,例如在原始笔记的末尾添加句点。我正在编写代码,将一个流文档的各个部分复制到另一个流文档,并在其中插入句点。

我在将列表复制到新文档时遇到问题。出于某种原因,第一个列表项总是在列表之前的段落而不是列表中结束。

我的代码:

foreach (Block b in tempDoc.Blocks)
                {
                    thisBlock++;
                    if (b is List)
                    {
                        pkhCommon.WPF.Helpers.AddBlock(b, mergedDocument);
                    }
                    else
                    {
                        Paragraph p = b as Paragraph;
                        foreach (Inline inl in p.Inlines)
                        {
                            if (!(inl is LineBreak))
                                pkhCommon.WPF.Helpers.AddInline(inl, mergedDocument);
                        }
                        if (thisElement != lastElement || thisBlock != lastBlock)
                            if ((bool)cb_AddPeriods.IsChecked)
                                pkhCommon.WPF.Helpers.AddInline(new Run(". "), mergedDocument);
                            else
                                pkhCommon.WPF.Helpers.AddInline(new Run(" "), mergedDocument);
                    }
                }

下面是合并块的函数。 AddIline 函数的工作方式相同。

    public static void AddBlock(Block from, FlowDocument to)
    {
        if (from != null)
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                TextRange range = new TextRange(from.ContentStart, from.ContentEnd);
                System.Windows.Markup.XamlWriter.Save(range, stream);
                range.Save(stream, DataFormats.XamlPackage);
                TextRange textRange2 = new TextRange(to.ContentEnd, to.ContentEnd);
                textRange2.Load(stream, DataFormats.XamlPackage);
            }
        }
    }

我不明白为什么流程文档决定将列表项放入前一段。

将块添加到 FlowDocument 的块集合中应将其放在末尾。
这对我有用。

Document.Blocks.Add(blockToAdd);

您正在执行 save/load 克隆块,对吗?您能否尝试在末尾以这种方式添加它,而不是插入到文本范围内?

var blockToAdd = XamlReader.Load(stream) as Block;
Document.Blocks.Add(blockToAdd);

你的部分问题是保存后,流位置在流的末尾,所以没有任何东西可以加载。可能有更好的方法来解决这个问题,但我没有时间提供帮助。将位置设置为 0 感觉不对。这没有解析异常。

        var from = new System.Windows.Documents.List(new ListItem(new Paragraph(new Run("Blah"))));
        using (var stream = new MemoryStream())
        {
            System.Windows.Markup.XamlWriter.Save(from, stream);
            stream.Position = 0;
            Block b = System.Windows.Markup.XamlReader.Load(stream) as Block;
        }