我根据本教程了解了如何执行此操作: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。另一种更简单的算法,即使它不同,也是可以接受的。 感谢。
答案 0 :(得分:0)
似乎我需要&#34;复制&#34;在将画布内容发送到打印机之前,将其放入新的画布类中。
从旧画布上清除它。有人能做得更好吗?