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();
        }
Example #2
0
        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);
            }
        }