从WPF画布打印时出错

本文关键字:打印 出错 WPF 布打印 | 更新日期: 2023-09-27 18:04:35

我学习如何做到这一点基于本教程:http://www.nbdtech.com/Blog/archive/2009/04/20/wpf-printing-part-2-the-fixed-document.aspx

这是我的打印按钮点击时触发的方法:

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;中删除元素也没有帮助(当然我在for循环之外尝试过),列表中只有1个画布。

注:我需要它是可多页的,因为我的文档通常很长(它是一个乐谱)。

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

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

从WPF画布打印时出错

似乎我需要在将画布内容发送到打印机之前将其"复制"到一个新的画布类中。

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