2012-04-12 5 views
1

私はFixedDocumentを作成し、動的にページを追加しています。wpf fixeddocument動的データ

public partial class Window1 : Window 
{ 
    FixedDocument fd = new FixedDocument(); 
    TextBlock page1Text = new TextBlock(); 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Print_Click(object sender, RoutedEventArgs e) 
    { 
     PrintDialog pd = new PrintDialog(); 


     fd.DocumentPaginator.PageSize = new Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight); 

     for (int i = 0; i <= 5; i++) 
     { 
      FixedPage page1 = new FixedPage(); 
      page1.Width = fd.DocumentPaginator.PageSize.Width; 
      page1.Height = fd.DocumentPaginator.PageSize.Height; 

      pages(); 
      page1.Children.Add(page1Text); 
      PageContent page1Content = new PageContent(); 
      ((IAddChild)page1Content).AddChild(page1); 
      fd.Pages.Add(page1Content); 
     } 

     DocumentViewer dr = new DocumentViewer(); 
     dr.Height = 700; 
     dr.Document =fd; 

     stack.Children.Add(dr); 


    } 

    private void pages() 
    { 
     page1Text.Text = "This is a test"; 
     page1Text.FontSize = 40; 
     page1Text.Margin = new Thickness(96); 

    } 

} 

コードはまだpage1contentが別の親の子であるというエラーを与えています。

答えて

0

私はそれをしました。解決策は次のとおりです。

private void Print_Click(object sender, RoutedEventArgs e) 
    { 
     PrintDialog pd = new PrintDialog(); 


fd.DocumentPaginator.PageSize = new Size(pd.PrintableAreaWidth,fd.PrintableAreaHeight); 

     for (int i = 0; i <= 5; i++) 
     { 
      FixedPage page1 = new FixedPage(); 
      page1.Width = fd.DocumentPaginator.PageSize.Width; 
      page1.Height = fd.DocumentPaginator.PageSize.Height; 

      UIElement page1Text = pages(); 
      page1.Children.Add(page1Text); 
      PageContent page1Content = new PageContent(); 
      ((IAddChild)page1Content).AddChild(page1); 
      fd.Pages.Add(page1Content); 
     } 

     DocumentViewer dr = new DocumentViewer(); 
     dr.Height = 700; 
     dr.Document =fd; 

     stack.Children.Add(dr); 


    } 

    private UIElement pages() 
    { 
     Canvas pcan = new Canvas(); 

     TextBlock page1Text = new TextBlock(); 
     page1Text.Text = "This is a test"; 
     page1Text.FontSize = 40; 
     page1Text.Margin = new Thickness(96); 

     pcan.Children.Add(page1Text); 


     return pcan; 
    } 

キャンバスをスキップできます。それは私のプロジェクトの必要条件なので、私はそれを試していました。

3

診断するのは簡単なエラーです。視覚的にのみは1つの親を持っています。そうでない場合はVisualTreeに循環依存性があります。同じビジュアルを2回使用しているかどうかを確認するには、コードを確認してください。

ビジュアルを同時に2つの場所に表示するには、ビジュアルを複製する必要があります。 2番目の使用が意図的である場合、親からそれ自身を削除することにより、ビジュアルの親を解除することができます。例えば()。サンプルコードで

私は、これが発生すると、以下にこれを詳述している場合の少なくとも一つインスタンスで識別することができました。


はあなたのwhile(loop)ブロックに複数回にvCanvasのインスタンスを追加しています。各反復ごとに新しいCanvasを作成する必要があります。この例の目的のために

var visual = /* unknown */; 
var fd = new FixedDocument(); 
while(loop) 
{ 
    var canvas = PageInit(); 
    var page = new FixedPage(); 
    page.Width = visual.DocumentPaginator.PageSize.Width; 
    page.Height = visual.DocumentPaginator.PageSize.Height; 
    page.Children.Add(canvas); 

    PageContent pageContent = new PageContent(); 
    ((IAddChild)pageContent).AddChild(page); 
    visual.Pages.Add(pageContent); 
} 

、私はPageInit()Canvasます。

private Canvas PageInit() 
{ 
    var tb = new TextBlock(); 
    tb.Text = "From Data"; 
    var canvas = new Canvas(); 
    canvas.Children.Add(tb); 

    return canvas; 
} 
+0

'canvas'に同じエラーが発生しました。この要素はすでに別の親の一部です。私はキャンバスキャンバス=新しいキャンバス()を使用しました。 canvas = printinit();それは正しい構文です。 –

+0

**完全な**コード例をまだ投稿していないので、私はあなたをさらに助けることができませんし、私もしたくありません。問題を少しはっきり説明するために私の答えを編集しました。がんばろう。 – Dennis

関連する問題