/// <summary> /// This is the event handler for PrintDocument.Paginate. It creates print preview pages for the app. /// </summary> /// <param name="sender">PrintDocument</param> /// <param name="e">Paginate Event Arguments</param> protected override void CreatePrintPreviewPages(object sender, PaginateEventArgs e) { base.CreatePrintPreviewPages(sender, e); PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(e.PrintTaskOptions); PrintPageRangeOptionDetails pageRangeOption = (PrintPageRangeOptionDetails)printDetailedOptions.Options[StandardPrintTaskOptions.CustomPageRanges]; // The number of pages may have been changed, so validate the Page Ranges again ValidatePageRangeOption(pageRangeOption); }
/// <summary> /// Option change event handler /// </summary> /// <param name="sender">PrintTaskOptionsDetails object</param> /// <param name="args">the event arguments containing the changed option id</param> void printDetailedOptions_OptionChanged(PrintTaskOptionDetails sender, PrintTaskOptionChangedEventArgs args) { string optionId = args.OptionId as string; if (string.IsNullOrEmpty(optionId)) { return; } // Handle change in Page Range Option if (optionId == StandardPrintTaskOptions.CustomPageRanges) { PrintPageRangeOptionDetails pageRangeOption = (PrintPageRangeOptionDetails)sender.Options[optionId]; ValidatePageRangeOption(pageRangeOption); } }
/// <summary> /// Deals with validating that the Page Ranges only contain pages that are present in the document. /// /// This is not necessary and some apps don't do this validation. Instead, they just ignore the pages /// that are not present in the document and simply don't print them. /// </summary> /// <param name="pageRangeOption">The PrintPageRangeOptionDetails option</param> void ValidatePageRangeOption(PrintPageRangeOptionDetails pageRangeOption) { IList <PrintPageRange> pageRanges = ((IList <PrintPageRange>)pageRangeOption.Value).ToImmutableList(); pageRangeOption.WarningText = ""; pageRangeOption.ErrorText = ""; // An empty list means AllPages, in which case we don't need to check the ranges if (pageRanges.Count > 0) { lock (printPreviewPages) { // Verify that the page ranges contain at least one printable page bool containsAtLeastOnePrintablePage = false; foreach (PrintPageRange pageRange in pageRanges) { if ((pageRange.FirstPageNumber <= printPreviewPages.Count) || (pageRange.LastPageNumber <= printPreviewPages.Count)) { containsAtLeastOnePrintablePage = true; break; } } if (containsAtLeastOnePrintablePage) { // Warn the user in case one of the page ranges contains pages that will not printed. That way, s/he // can fix the page numbers in case they were mistyped. foreach (PrintPageRange pageRange in pageRanges) { if ((pageRange.FirstPageNumber > printPreviewPages.Count) || (pageRange.LastPageNumber > printPreviewPages.Count)) { pageRangeOption.WarningText = "One of the ranges contains pages that are not present in the document"; break; } } } else { pageRangeOption.ErrorText = "Those pages are not present in the document"; } } } }