Steven
Steven

Reputation: 401

WPF print window without displaying it

I have several WPF windows with controls. I would like to print them one after the other without displaying them. Is there a way of doing that?

This is the printing method:

public void printItemList(string printerName)
    {
        printButton.Visibility = Visibility.Collapsed;
        cancelButton.Visibility = Visibility.Collapsed;
        this.Height = 1250;
        this.Width = 815;
        PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
        printDlg.PrintQueue = new System.Printing.PrintQueue(new System.Printing.PrintServer(), printerName);
        System.Printing.PrintCapabilities capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);

        //get scale of the print wrt to screen of WPF visual
        double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / this.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                       this.ActualHeight);

        //Transform the Visual to scale
        this.LayoutTransform = new ScaleTransform(scale, scale);

        //get the size of the printer page
        Size sz = new Size(this.ActualWidth, this.ActualHeight); //(8.5 * 96.0, 11.0 * 96.0);

        //update the layout of the visual to the printer page size.
        this.Measure(sz);
        this.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));

        //now print the visual to printer to fit on the one page.
        printDlg.PrintVisual(this, String.Empty);
    }

Upvotes: 1

Views: 1078

Answers (1)

Steven
Steven

Reputation: 401

Moving out the window was the key, thanks for the tip!

ItemListWindow il = new ItemListWindow();
il.Show();
var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
il.Top = desktopWorkingArea.Bottom + 100;
il.printItemList(printerComboBox.SelectedItem.ToString());
il.Close();

Upvotes: 1

Related Questions