private void PrintPreview_Click(object sender, RoutedEventArgs e) { var printdialog = new PrintDialog(); if (printdialog.ShowDialog() != true) { return; } var doc = new FixedDocument(); doc.DocumentPaginator.PageSize = new Size(printdialog.PrintableAreaWidth, printdialog.PrintableAreaHeight); var queue = printdialog.PrintQueue; var caps = queue.GetPrintCapabilities(); var area = caps.PageImageableArea; var marginwidth = (printdialog.PrintableAreaWidth - caps.PageImageableArea.ExtentWidth) / 2.0; var marginheight = (printdialog.PrintableAreaHeight - caps.PageImageableArea.ExtentHeight) / 2.0; double gutter; if (!Double.TryParse(GutterWidthTextbox.Text, out gutter)) { gutter = 0.25; } // Translate inches to device independent pixels gutter *= 96.0; var opts = new PrintOptions { PrintableWidth = area.ExtentWidth, PrintableHeight = area.ExtentHeight, MarginWidth = marginwidth, MarginHeight = marginheight, Gutter = gutter }; var category = (CardCategory)DataContext; category.AddPagesToDocument(doc, opts, category.SelectedCards); var preview = new PrintPreview(); preview.Document = doc; preview.ShowDialog(); }
public void AddPagesToDocument(FixedDocument doc, PrintOptions options, IEnumerable<dynamic> cards) { // Measure the cards to find out how many fit on a page var cardui_measure = this.LoadXaml(); var adjustedwidth = options.PrintableWidth + options.Gutter; var adjustedheight = options.PrintableHeight + options.Gutter; var cardsperrow = Math.Floor(adjustedwidth / (cardui_measure.Width + options.Gutter)); var rotcardsperrow = Math.Floor(adjustedwidth / (cardui_measure.Height + options.Gutter)); var cardspercol = Math.Floor(adjustedheight / (cardui_measure.Height + options.Gutter)); var rotcardspercol = Math.Floor(adjustedheight / (cardui_measure.Width + options.Gutter)); var cardsperpage = cardsperrow * cardspercol; var rotcardsperpage = rotcardsperrow * rotcardspercol; bool shouldrotate = rotcardsperpage > cardsperpage; var actualcardsperpage = (shouldrotate) ? rotcardsperpage : cardsperpage; var actualcardsperrow = (shouldrotate) ? rotcardsperrow : cardsperrow; var actualcardwidth = (shouldrotate) ? cardui_measure.Height : cardui_measure.Width; var actualcardheight = (shouldrotate) ? cardui_measure.Width : cardui_measure.Height; var cardsthispage = 0; FixedPage page = null; Canvas canvas = null; // Add the cards to pages. foreach (var card in cards) { uint cardcount; if (fixedprint) { cardcount = printcount; } else { var carddict = (IDictionary<string, object>)card; if (!UInt32.TryParse((string)carddict[printcountattribute], out cardcount)) { cardcount = 1; } } for (uint i = 0; i < cardcount; i++) { if (page == null) { page = new FixedPage(); canvas = new Canvas(); page.Children.Add(canvas); } var cardui = this.LoadXaml(); cardui.DataContext = card; cardui.Measure(new Size(cardui.Width, cardui.Height)); cardui.Arrange(new Rect(0, 0, cardui.Width, cardui.Height)); if (shouldrotate) { cardui.RenderTransform = new RotateTransform(90); } var xpos = cardsthispage % ((int)actualcardsperrow); var ypos = cardsthispage / ((int)actualcardsperrow); canvas.Children.Add(cardui); Canvas.SetLeft(cardui, ((actualcardwidth + options.Gutter) * xpos) + options.MarginWidth + ((shouldrotate) ? actualcardwidth : 0.0)); Canvas.SetTop(cardui, ((actualcardheight + options.Gutter) * ypos) + options.MarginHeight); // If we've reached the max number of cards on this page, close it out. cardsthispage++; if (cardsthispage == actualcardsperpage) { cardsthispage = 0; var pagecontent = new PageContent(); pagecontent.Child = page; doc.Pages.Add(pagecontent); page = null; } } } if (page != null) { var pagecontent = new PageContent(); pagecontent.Child = page; doc.Pages.Add(pagecontent); } }