2016-04-21 3 views
1

複数の音符を1つの音符にマージする拡張機能を作成しています。元の音符の最後にピリオドを追加するなどの機能があります。私はあるフロードキュメントの部分を別のものにコピーし、そのようにピリオドを挿入するコードを書いています。Flowdocumentにリストをコピーすると1番目のリストアイテムが壊れる

新しい文書にリストをコピーする際に問題が発生しています。何らかの理由で、最初の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); 
      } 
     } 
    } 

なぜ、フロードキュメントが前の段落にリスト項目を入れるかを理解できません。

答えて

0

ブロックをFlowDocumentのブロックコレクションに追加すると、最後に配置する必要があります。
これは私のために働く。

Document.Blocks.Add(blockToAdd); 

ブロックのクローンを作成するためにセーブ/ロードを実行していますか?テキスト範囲に挿入するのではなく、最後にこの方法で追加することはできますか?あなたの問題の

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

xamlparse例外が発生しました。ルート要素がありません。私はこのコードを使いました: 'using(System.IO.MemoryStream stream = new System.IO.MemoryStream()) { TextRange range = new TextRange(from.ContentStart、fromContentEnd); System.Windows.Markup.XamlWriter.Save(range、stream); range.Save(stream、DataFormats.XamlPackage); ブロックb =ブロックとしてのSystem.Windows.Markup.XamlReader.Load(ストリーム)。 to.Blocks.Add(b); } ' –

+0

私はそれを修正する最善の方法はわかりませんが、ストリームの終わりにいるように見えるので、ロードされても何もロードされません。ストリームの位置をリセットするとそれが修正されます。私の編集された答えを見てください。 – frooook

+0

私は 'System.Windows.Markup.XamlWriter.Save(range、stream);'行も削除しなければなりませんでした。その後、それは働いた。 –

関連する問題