将列表复制到 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;
}
我正在编写一个扩展程序,允许用户将多个笔记合并为一个笔记,并提供一些功能,例如在原始笔记的末尾添加句点。我正在编写代码,将一个流文档的各个部分复制到另一个流文档,并在其中插入句点。
我在将列表复制到新文档时遇到问题。出于某种原因,第一个列表项总是在列表之前的段落而不是列表中结束。
我的代码:
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;
}