/// <summary> /// Handler for the Print command. /// </summary> protected override void OnPrintCommand() { #if !DONOTREFPRINTINGASMMETA System.Windows.Xps.XpsDocumentWriter docWriter; System.Printing.PrintDocumentImageableArea ia = null; FlowDocumentPaginator paginator; FlowDocument document = Document as FlowDocument; Thickness pagePadding; // Only one printing job is allowed. if (_printingState != null) { return; } // If the document is FlowDocument, do custom printing. Otherwise go through default path. if (document != null) { // Show print dialog. docWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(ref ia); if (docWriter != null && ia != null) { // Store the current state of the document in the PrintingState paginator = ((IDocumentPaginatorSource)document).DocumentPaginator as FlowDocumentPaginator; _printingState = new FlowDocumentPrintingState(); _printingState.XpsDocumentWriter = docWriter; _printingState.PageSize = paginator.PageSize; _printingState.PagePadding = document.PagePadding; _printingState.IsSelectionEnabled = IsSelectionEnabled; // Since _printingState value is used to determine CanExecute state, we must invalidate that state. CommandManager.InvalidateRequerySuggested(); // Register for XpsDocumentWriter events. docWriter.WritingCompleted += new WritingCompletedEventHandler(HandlePrintCompleted); docWriter.WritingCancelled += new WritingCancelledEventHandler(HandlePrintCancelled); // Add PreviewCanExecute handler to have a chance to disable UI Commands during printing. CommandManager.AddPreviewCanExecuteHandler(this, new CanExecuteRoutedEventHandler(PreviewCanExecuteRoutedEventHandler)); // Suspend layout on DocumentPageViews. ReadOnlyCollection<DocumentPageView> pageViews = PageViews; for (int index = 0; index < pageViews.Count; index++) { pageViews[index].SuspendLayout(); } // Disable TextSelection, if currently enabled. if (IsSelectionEnabled) { IsSelectionEnabled = false; } // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device. paginator.PageSize = new Size(ia.MediaSizeWidth, ia.MediaSizeHeight); pagePadding = document.ComputePageMargin(); document.PagePadding = new Thickness( Math.Max(ia.OriginWidth, pagePadding.Left), Math.Max(ia.OriginHeight, pagePadding.Top), Math.Max(ia.MediaSizeWidth - (ia.OriginWidth + ia.ExtentWidth), pagePadding.Right), Math.Max(ia.MediaSizeHeight - (ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom)); // Send DocumentPaginator to the printer. docWriter.WriteAsync(paginator); } } else { base.OnPrintCommand(); } #endif // DONOTREFPRINTINGASMMETA }
/// <summary> /// Handler for the Print command. /// </summary> protected virtual void OnPrintCommand() { #if !DONOTREFPRINTINGASMMETA System.Windows.Xps.XpsDocumentWriter docWriter; System.Printing.PrintDocumentImageableArea ia = null; FlowDocumentPaginator paginator; Thickness pagePadding; // Only one printing job is allowed. if (_printingState != null) { return; } // If the document is FlowDocument, do custom printing. Otherwise go through default path. if (Document != null) { // Show print dialog. docWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(ref ia); if (docWriter != null && ia != null) { // Suspend layout on FlowDocumentView. if (RenderScope != null) { RenderScope.SuspendLayout(); } // Store the current state of the document in the PrintingState paginator = ((IDocumentPaginatorSource)Document).DocumentPaginator as FlowDocumentPaginator; _printingState = new FlowDocumentPrintingState(); _printingState.XpsDocumentWriter = docWriter; _printingState.PageSize = paginator.PageSize; _printingState.PagePadding = Document.PagePadding; _printingState.IsSelectionEnabled = IsSelectionEnabled; _printingState.ColumnWidth = Document.ColumnWidth; // Since _printingState value is used to determine CanExecute state, we must invalidate that state. CommandManager.InvalidateRequerySuggested(); // Register for XpsDocumentWriter events. docWriter.WritingCompleted += new WritingCompletedEventHandler(HandlePrintCompleted); docWriter.WritingCancelled += new WritingCancelledEventHandler(HandlePrintCancelled); // Add PreviewCanExecute handler to have a chance to disable UI Commands during printing. if (_contentHost != null) { CommandManager.AddPreviewCanExecuteHandler(_contentHost, new CanExecuteRoutedEventHandler(PreviewCanExecuteRoutedEventHandler)); } // Disable TextSelection, if currently enabled. if (IsSelectionEnabled) { SetCurrentValueInternal(IsSelectionEnabledProperty, BooleanBoxes.FalseBox); } // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device. paginator.PageSize = new Size(ia.MediaSizeWidth, ia.MediaSizeHeight); pagePadding = Document.ComputePageMargin(); Document.PagePadding = new Thickness( Math.Max(ia.OriginWidth, pagePadding.Left), Math.Max(ia.OriginHeight, pagePadding.Top), Math.Max(ia.MediaSizeWidth - (ia.OriginWidth + ia.ExtentWidth), pagePadding.Right), Math.Max(ia.MediaSizeHeight - (ia.OriginHeight + ia.ExtentHeight), pagePadding.Bottom)); Document.ColumnWidth = double.PositiveInfinity; // Send DocumentPaginator to the printer. docWriter.WriteAsync(paginator); } else { OnPrintCompleted(); } } else { OnPrintCompleted(); } #endif // DONOTREFPRINTINGASMMETA }