1

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 が別の親の子であるというエラーを出しています。

4

2 に答える 2

3

診断するのは簡単なエラーです。ビジュアルは 1 つの親しか持つことができませVisualTree。それ以外の場合は、 . コードを見直して、同じビジュアルを 2 回使用していないかどうかを確認してください。

ビジュアルを 2 つの場所に同時に表示する場合は、複製する必要があります。2 回目の使用が意図的なものである場合は、ビジュアル自体を親から削除することでビジュアルの親を解除できます。例 ( canvas.Parent.Remove(canvas))。

投稿されたコード サンプルで、これが発生する場所のインスタンスを少なくとも 1 つ特定できます。詳細を以下に示します。


のインスタンスをブロックvCanvasに複数回追加していますwhile(loop)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);
}

この例では、 をCanvasにしPageInit()ます。

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

    return canvas;
}
于 2012-04-12T06:40:29.313 に答える
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;
    }

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

于 2012-04-12T14:54:48.790 に答える