2012-04-12 36 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

这是一个很容易的错误诊断;一个视觉只能有有一个父母,否则你会在VisualTree有循环依赖。查看你的代码,检查你是否使用了相同的视觉两次。

如果你想让视觉同时出现在两个地方,那么你需要复制它;如果第二次使用是故意的,那么您可以通过从父级中删除自己来取消父级视觉。例如(canvas.Parent.Remove(canvas))。

在发布的代码示例中,我可以在处识别至少一个发生此事的实例,并在下面详细说明。


你在你的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); 
} 

对于这个例子的目的,我将CanvasPageInit()

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

    return canvas; 
} 
+0

现在,对于“画布”,现在发生的错误是该元素已经是另一父项的一部分。我用Canvas canvas = new Canvas(); canvas = printinit();这是正确的语法。 – 2012-04-12 10:43:45

+0

由于您还没有发布**完整**代码示例,因此我无法进一步帮助您(我也不想)。我编辑了我的答案,以更清楚地解释问题。祝你好运。 – Dennis 2012-04-12 10:57:29