2016-04-21 10 views
1

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.

Antwort

0

Das Hinzufügen eines Blocks zur Blockauflistung des FlowDocuments sollte am Ende stehen.
Das funktioniert für mich.

Document.Blocks.Add(blockToAdd); 

Sie machen das Speichern/Laden, um den Block zu klonen, oder? Kannst du es einfach am Ende auf diese Weise hinzufügen, anstatt es in den Textbereich einzufügen?

Teil Ihres Problems ist, dass nach dem Speichern die Stream-Position am Ende des Streams ist, also gibt es nichts zu laden. Es gibt wahrscheinlich einen besseren Weg, dies zu beheben, aber ich habe keine Zeit zu helfen. Die Einstellung der Position auf 0 fühlt sich falsch an. Dies hat keine Parse-Ausnahme.

 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; 
     } 
+0

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); } ' –

+0

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

+0

Ich musste auch die Zeile 'System.Windows.Markup.XamlWriter.Save (range, stream);' entfernen. Danach hat es funktioniert. –