Я пытаюсь напечатать сетку WPF, содержащую несколько элементов, включая текстовые поля и две сетки данных. Поскольку он работает более чем на одной странице A4, я использовал метод FixedDocument для печати, перебирая сетку данных для каждой страницы и создавая различный заголовок для второй и последующих страниц. Однако используемый мной код, основанный на ответе на Разметка WPF FixedDocument , не создает, например, отдельные страницы 1, 2 и 3, а просто создает три копии последней страницы.
Я попытался повторно инициализировать все переменные PageContent и FrameWorkElement для каждой отдельной страницы, но все же последняя страница переопределяет каждую страницу, которая была добавлена в FixedDocument ранее. Я нашел простой способ печати отдельных страниц на http://www.nbdtech.com/Blog/archive/2009/04/20/wpf-printing-part-2-the-fixed-document.aspx,, но если я пытаюсь добавить свою сетку, а не простое текстовое поле в качестве дочернего элемента FixedPage, я получаю «Указанный элемент уже является логическим дочерним элементом другого элемента ..." ошибка.
Я также пытался печатать напрямую (а не через PrintPreview), используя
printDialog.PrintDocument (fixedDoc.DocumentPaginator, «Нет предварительного просмотра»)
но получить тот же результат.
Вот фрагмент кода из моего метода Print:
PrintDialog printDlg = new PrintDialog();
printDlg.PrintTicket.PageOrientation = PageOrientation.Portrait;
printDlg.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
var toPrint = new FrameworkElement();
toPrint = grdPrintingGrid;
var capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);
var pageSize = new Size(printDlg.PrintableAreaWidth, printDlg.PrintableAreaHeight);
var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
var fixedDoc = new FixedDocument();
//If the toPrint visual is not displayed on screen we neeed to measure and arrange it
toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
//
var size = toPrint.DesiredSize;
//Will assume for simplicity the control fits horizontally on the page
int numPages = 3;//TODO Will be calculated with reference to actual datagrid rows
for (int i = 0; i < numPages; i++)
{
var pageContent = new PageContent();
var page = new FixedPage();
var canvas = new Canvas();
if (i > 0) //Change headers and datagrid row selection for second and subsequent pages
{
SetHeaders(true);
dgdExpenseTransactions.ItemsSource = testDataExpense.Skip(5).Take(10+(numPages*2)).ToList();//For demo only
grdPrintingGrid.UpdateLayout();
pageContent = new PageContent();
page = new FixedPage();
canvas = new Canvas();
}
toPrint = grdPrintingGrid;
var vb = new VisualBrush(toPrint)
{
Stretch = Stretch.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
ViewboxUnits = BrushMappingMode.Absolute,
TileMode = TileMode.None,
Viewbox = new Rect(0, 0, visibleSize.Width, visibleSize.Height)
};
page.Width = pageSize.Width;
page.Height = pageSize.Height;
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
canvas.Width = visibleSize.Width;
canvas.Height = visibleSize.Height;
canvas.Background = vb;
page.Children.Add(canvas);
((IAddChild)pageContent).AddChild(page);
fixedDoc.Pages.Add(pageContent);
}
PDFPrintTest.PrintMethods.PrintHelper.ShowPrintPreview(fixedDoc);
Есть ли какой-нибудь способ добиться этой переменной разбивки на страницы, используя FixedDocuments для получения страниц, которые показывают различные части таблицы данных и заголовков, которые до сих пор ускользали от меня? Или просто FixedDocument не подходит для печати, когда требуются разные заголовки и содержимое страницы?