从WPF Canvas打印时出错

时间:2014-05-22 19:19:17

标签: c# wpf canvas printing io

我根据本教程了解了如何执行此操作:http://www.nbdtech.com/Blog/archive/2009/04/20/wpf-printing-part-2-the-fixed-document.aspx

这是点击时我的Print Button触发的方法:

PrintManager _pm;
private void btnPrint_Click(object sender, RoutedEventArgs e)
{
    _pm = new PrintManager(); 
    List<Canvas> pages = new List<Canvas>();
    pages.Add(cnv);

    _pm.Print(pages);
}

这是我的PrintManager.cs(_pm):

    private const double PAGE_WIDTH = 793.92; //8.27' * 96px
    private const double PAGE_HEIGHT = 1122.24; //11.69' * 96px

    private FixedDocument _document;
    private List<FixedPage> _listOfPages;
    private PageContent _tempPageContent;
    private FixedPage _tempPage;

    public PrintManager()
    {

    }

    public void Print(List<Canvas> pages)
    {
        PrintDialog pd = new PrintDialog();
        Canvas temp;
        if (pd.ShowDialog() == true)
        {
            _document = new FixedDocument();
            _document.DocumentPaginator.PageSize = new System.Windows.Size(PAGE_WIDTH, PAGE_HEIGHT);

            _listOfPages = new List<FixedPage>();

            for (int i = 0; i < pages.Count; i++)
            {
                _listOfPages.Add(new FixedPage());
                _tempPage = _listOfPages[_listOfPages.Count - 1];
                _tempPage.Width = PAGE_WIDTH;
                _tempPage.Height = PAGE_HEIGHT;

                _tempPage.Children.Add(pages[i]); //THIS IS THE PROBLEM LINE

                _tempPageContent = new PageContent();
                ((IAddChild)_tempPageContent).AddChild(_tempPage);

                _document.Pages.Add(_tempPageContent);
            }

            pd.PrintDocument(_document.DocumentPaginator, "Docdoc");
        }
    }

事实证明,问题行(_tempPage.Children.Add(pages[i]);)行出现了错误:

  

指定的元素已经是另一个元素的逻辑子元素。首先断开它。

知道为什么吗?

甚至在将private List<FixedPage> _listOfPages;添加到页面列表中之前从{{1}}中删除它也没有帮助(当然我在for循环之外尝试了它),列表中只有1个画布。

P.S。我需要它能够多页,因为我的文档通常很长(这是乐谱)。

P.S.S。即使打印没有手动添加子项的画布,错误仍然是相同的。

P.S.S.S。另一种更简单的算法,即使它不同,也是可以接受的。 感谢。

1 个答案:

答案 0 :(得分:0)

似乎我需要&#34;复制&#34;在将画布内容发送到打印机之前,将其放入新的画布类中。

从旧画布上清除它。有人能做得更好吗?