Ich schreibe eine Erweiterung, die es einem Benutzer ermöglicht, mehrere Notizen zu einer einzigen Notiz zusammenzufassen und bietet einige Funktionen wie das Hinzufügen von Punkten am Ende der ursprünglichen Notizen. Ich schreibe den Code, der die Teile eines Fließdokuments in ein anderes kopiert und die Punkte so einfügt, wie es geht.Liste in Flowdocument kopieren vermisst 1. liseitem
Ich habe Probleme beim Kopieren von Listen in das neue Dokument. Aus irgendeinem Grund endet das erste Listenelement immer im Absatz VOR der Liste anstatt in der Liste.
Mein Code:
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);
}
}
Unten ist die Funktion, um die Blöcke zu fusionieren. Die AddIline-Funktion funktioniert auf die gleiche Weise.
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);
}
}
}
Ich kann nicht verstehen, warum das flowdocument entscheidet, das listitem in den Abschnitt PREceeding zu setzen.
Ich bekomme nur eine xamlparse Ausnahme: Root-Element fehlt. Ich habe diesen Code verwendet: 'using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { TextRange Bereich = new TextRange (from.ContentStart, from.ContentEnd); System.Windows.Markup.XamlWriter.Save (Bereich, Stream); range.Save (Strom, DataFormats.XamlPackage); Blockieren Sie b = System.Windows.Markup.XamlReader.Load (stream) als Block; zu.Blocks.Add (b); } ' –
Ich bin mir nicht sicher über die beste Möglichkeit, es zu beheben, aber Ihr Problem scheint zu sein, dass Sie am Ende des Streams sind, also wenn es geladen wird, gibt es nichts zu laden. Durch das Zurücksetzen der Stream-Position wird das Problem behoben. Siehe meine bearbeitete Antwort. – frooook
Ich musste auch die Zeile 'System.Windows.Markup.XamlWriter.Save (range, stream);' entfernen. Danach hat es funktioniert. –