从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.另一种更简单的算法,即使不同,也是可以接受的。谢谢。
似乎我需要在将画布内容发送到打印机之前将其"复制"到一个新的画布类中。
并从旧画布中清除。有人能做得更好吗?