2012-04-12 22 views
1

Ich erstelle FixedDocument und fügt dynamisch Seiten hinzu.wpf fixeddocument dynamische Daten

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); 

    } 

} 

Der Code gibt immer noch Fehler, dass page1content ein Kind eines anderen Elternteils ist.

Antwort

0

Ich habe es getan. Die Lösung ist wie folgt

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

Sie können die Leinwand überspringen. Es ist ein Requirement meines Projekts, also habe ich es versucht.

3

Es ist ein einfacher Fehler zu diagnostizieren; eine visuelle kann nur jemals haben ein Elternteil, da sonst eine zirkuläre Abhängigkeit in der VisualTree hätte. Überprüfen Sie Ihren Code, um zu überprüfen, ob Sie das gleiche Bildelement zweimal verwenden.

Wenn Sie möchten, dass das Visuelle gleichzeitig an zwei Stellen erscheint, müssen Sie es duplizieren; Wenn die zweite Verwendung beabsichtigt ist, können Sie die visuelle Darstellung entfernen, indem Sie sich selbst vom übergeordneten Objekt entfernen. z.B. (canvas.Parent.Remove(canvas)).

Im angegebenen Code-Beispiel kann ich unter mindestens eine Instanz angeben, wo dies auftreten würde, und dies unten ausführlich beschrieben.


Sie fügen die Instanz von vCanvas mehr als einmal in Ihrem while(loop) Block. Sie müssen für jede Iteration eine neue Canvas erstellen.

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

Für die Zwecke dieses Beispiels, das werde ich die Canvas im PageInit().

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

    return canvas; 
} 
+0

Es gibt jetzt den gleichen Fehler für 'Leinwand', dass dieses Element bereits ein Teil eines anderen Elternteils ist. Ich habe Canvas Canvas = new Canvas(); leinwand = printinit(); Ist es die korrekte Syntax? –

+0

Da Sie kein ** vollständiges ** Codebeispiel gepostet haben, kann ich Ihnen nicht weiter helfen (und will es auch nicht). Ich habe meine Antwort bearbeitet, um das Problem etwas deutlicher zu erklären. Viel Glück. – Dennis