Personalizar la interfaz de usuario de la vista previa de impresión
En este tema se describe cómo personalizar las opciones de impresión y la configuración en la interfaz de usuario de vista previa de impresión. Para obtener más información sobre la impresión, consulta Imprimir desde la aplicación.
- API importantes: Espacio de nombres Windows.Graphics.Printing, Clase PrintTask, StandardPrintTaskOptions, Espacio de nombres Microsoft.UI.Xaml.Printing, clase PrintDocument
Personalizar las opciones de impresión
De forma predeterminada, la interfaz de usuario de vista previa de impresión muestra las opciones de impresión ColorMode, Copias y Orientación. Además de eso, hay otras opciones comunes de impresora que puede agregar a la interfaz de usuario de vista previa de impresión:
- Binding
- Limítrofe
- Intercalación
- CustomPageRanges
- Dúplex
- HolePunch
- InputBin
- MediaSize
- MediaType
- NUp
- PrintQuality
- Grapa
Estas opciones se definen en la clase StandardPrintTaskOptions . Puede agregar o quitar opciones de la lista de opciones que se muestran en la interfaz de usuario de vista previa de impresión. También puede cambiar el orden en que aparecen y establecer la configuración predeterminada que se muestra al usuario.
Sin embargo, las modificaciones que realice de esta manera afectan solo a la interfaz de usuario de vista previa de impresión. El usuario siempre puede acceder a todas las opciones que admite la impresora pulsando Más opciones en la interfaz de usuario de vista previa de impresión.
Definir las opciones que se van a mostrar
Al registrar la aplicación para imprimir (consulta Imprimir desde la aplicación), parte de ese registro incluye definir el controlador de eventos PrintTaskRequested . El código para personalizar las opciones que se muestran en la interfaz de usuario de vista previa de impresión se agrega al controlador de eventos PrintTaskRequested.
Después de crear printTask en el controlador de eventos PrintTaskRequested, puede obtener la lista DisplayedOptions, que contiene los elementos de opción que se muestran en la interfaz de usuario de vista previa de impresión. Puede modificar esta lista insertando, anexando, quitando o ordenando opciones.
Nota:
Aunque la aplicación puede especificar las opciones de impresión que se van a mostrar, solo las admitidas por la impresora seleccionada se muestran en la interfaz de usuario de vista previa de impresión. La interfaz de usuario de impresión no mostrará las opciones que la impresora seleccionada no admite.
private void PrintTask_Requested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
// Create the PrintTask.
// Defines the title and delegate for PrintTaskSourceRequested.
PrintTask printTask = args.Request.CreatePrintTask("WinUI 3 Printing example", PrintTaskSourceRequested);
// Handle PrintTask.Completed to catch failed print jobs.
printTask.Completed += PrintTask_Completed;
DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
InvokePrintingButton.IsEnabled = false;
});
// Customize options displayed in print preview UI.
// Get the list of displayed options.
IList<string> displayedOptions = printTask.Options.DisplayedOptions;
// Choose the printer options to be shown.
// The order in which the options are appended determines
// the order in which they appear in the UI.
displayedOptions.Clear();
displayedOptions.Add(StandardPrintTaskOptions.Copies);
displayedOptions.Add(StandardPrintTaskOptions.Orientation);
displayedOptions.Add(StandardPrintTaskOptions.MediaSize);
displayedOptions.Add(StandardPrintTaskOptions.Collation);
displayedOptions.Add(StandardPrintTaskOptions.Duplex);
// Preset the default value of the print media size option.
printTask.Options.MediaSize = PrintMediaSize.NorthAmericaLegal;
}
Especificar opciones predeterminadas
También puede establecer los valores predeterminados de las opciones en la interfaz de usuario de vista previa de impresión. La siguiente línea de código, del último ejemplo, establece el valor predeterminado de la opción MediaSize .
// Preset the default value of the print media size option.
printTask.Options.MediaSize = PrintMediaSize.NorthAmericaLegal;
Nota:
Al establecer los valores de la lista DisplayedOptions, se usa el nombre que obtiene de StandardPrintTaskOptions (por ejemplo, StandardPrintTaskOptions.MediaSize).
Al establecer el valor predeterminado de una opción, se usa PrintTaskOptions (por ejemplo, PrintTaskOptions.MediaSize).
Adición de opciones de impresión personalizadas
Aquí se muestra cómo crear una nueva opción de impresión personalizada, definir una lista de valores que admite la opción y, a continuación, agregar la opción a la vista previa de impresión. En este ejemplo, la opción de impresión personalizada permite al usuario especificar si se debe imprimir solo el texto de la página, solo la imagen o tanto el texto como la imagen. Las opciones se presentan en una lista desplegable.
Para garantizar una buena experiencia de usuario, el sistema requiere que la aplicación controle el evento PrintTaskRequested dentro del tiempo especificado por PrintTaskRequestedEventArgs.Request.Deadline. Por lo tanto, usamos el controlador PrintTaskRequested solo para crear la tarea de impresión. La personalización de la configuración de impresión se puede realizar cuando se solicita el origen del documento de impresión. Aquí, usamos una expresión lambda para definir la línea PrintTaskSourceRequestedHandler, que proporciona un acceso más sencillo a PrintTask.
En primer lugar, obtenga un objeto PrintTaskOptionDetails y su lista de DisplayedOptions. Se usa para agregar la nueva opción de impresión a la interfaz de usuario de vista previa de impresión.
A continuación, para presentar las opciones de impresión personalizadas en una lista desplegable, llame a PrintTaskOptionDetails.CreateItemListOption para crear un objeto PrintCustomItemListOptionDetails . Cree la nueva opción de impresión e inicialice la lista de valores de opción. Por último, agregue la nueva opción a la lista DisplayedOptions y asigne un controlador para el evento OptionChanged . Dado que acaba de agregar una nueva opción de impresión al final de la lista de opciones predeterminadas, no es necesario borrar la lista DisplayedOptions; simplemente agregue la nueva opción.
private void PrintTask_Requested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
// Create the PrintTask.
PrintTask printTask = null;
printTask = args.Request.CreatePrintTask("WinUI 3 Printing example", sourceRequestedArgs =>
{
PrintTaskSourceRequestedDeferral deferral =
sourceRequestedArgs.GetDeferral();
PrintTaskOptionDetails printDetailedOptions =
PrintTaskOptionDetails.GetFromPrintTaskOptions(printTask.Options);
IList<string> displayedOptions = printDetailedOptions.DisplayedOptions;
// Create a new list option.
PrintCustomItemListOptionDetails pageFormat =
printDetailedOptions.CreateItemListOption("PageContent", "Page content");
pageFormat.AddItem("PicturesText", "Pictures and text");
pageFormat.AddItem("PicturesOnly", "Pictures only");
pageFormat.AddItem("TextOnly", "Text only");
// Add the custom option to the option list
displayedOptions.Add("PageContent");
printDetailedOptions.OptionChanged += PrintDetailedOptions_OptionChanged;
sourceRequestedArgs.SetSource(printDocumentSource);
deferral.Complete();
});
// Handle PrintTask.Completed to catch failed print jobs.
printTask.Completed += PrintTask_Completed;
DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
InvokePrintingButton.IsEnabled = false;
});
}
Las opciones aparecen en la interfaz de usuario de vista previa de impresión en el mismo orden en que se anexan, con la primera opción que se muestra en la parte superior de la ventana. En este ejemplo, la opción personalizada se anexa en último lugar para que aparezca en la parte inferior de la lista de opciones. Sin embargo, podría colocarlo en cualquier parte de la lista; No es necesario agregar las opciones de impresión personalizadas en último lugar.
Cuando el usuario cambie la opción seleccionada en la opción personalizada, use la opción seleccionada para actualizar la imagen de vista previa de impresión. Después de actualizar el diseño de vista previa de impresión, llame al método InvalidatePreview para volver a dibujar la imagen en la interfaz de usuario de vista previa de impresión, como se muestra aquí.
void PrintDetailedOptions_OptionChanged(PrintTaskOptionDetails sender,
PrintTaskOptionChangedEventArgs args)
{
string optionId = args.OptionId as string;
if (string.IsNullOrEmpty(optionId))
{
return;
}
if (optionId == "PageContent")
{
PrintCustomItemListOptionDetails pageContentOption =
(PrintCustomItemListOptionDetails)sender.Options["PageContent"];
string pageContentValue = pageContentOption.Value.ToString();
if (pageContentValue == "PicturesOnly")
{
pageLayoutOption = PageLayoutOption.Images;
}
else if (pageContentValue == "TextOnly")
{
pageLayoutOption = PageLayoutOption.Text;
}
else
{
pageLayoutOption = PageLayoutOption.TextAndImages;
}
DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
printDocument.InvalidatePreview();
});
}
}
Para admitir el uso de las opciones personalizadas en la página, agregue una enumeración para las opciones disponibles y una variable de nivel de página para contener la opción seleccionada.
internal enum PageLayoutOption : int
{
Text = 1,
Images = 2,
TextAndImages = 3
}
PageLayoutOption pageLayoutOption = PageLayoutOption.TextAndImages;
A continuación, use la opción seleccionada en el controlador Paginate donde agregue el contenido para la vista previa de impresión.
private void PrintDocument_Paginate(object sender, PaginateEventArgs e)
{
// Clear the cache of preview pages.
printPreviewPages.Clear();
// Get the PrintTaskOptions.
PrintTaskOptions printingOptions = ((PrintTaskOptions)e.PrintTaskOptions);
// Get the page description to determine the size of the print page.
PrintPageDescription pageDescription = printingOptions.GetPageDescription(0);
// Create the print layout.
StackPanel printLayout = new StackPanel();
printLayout.Width = pageDescription.PageSize.Width;
printLayout.Height = pageDescription.PageSize.Height;
printLayout.BorderBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Microsoft.UI.Colors.DimGray);
printLayout.BorderThickness = new Thickness(48);
// Use the custom print layout options to determine
// which elements to add to the print page.
if (pageLayoutOption == PageLayoutOption.Images ||
pageLayoutOption == PageLayoutOption.TextAndImages)
{
Image printImage = new Image();
printImage.Source = printContent.Source;
printImage.Width = pageDescription.PageSize.Width / 2;
printImage.Height = pageDescription.PageSize.Height / 2;
printLayout.Children.Add(printImage);
}
if (pageLayoutOption == PageLayoutOption.Text ||
pageLayoutOption == PageLayoutOption.TextAndImages)
{
TextBlock imageDescriptionText = new TextBlock();
imageDescriptionText.Text = imageDescription.Text;
imageDescriptionText.FontSize = 24;
imageDescriptionText.HorizontalAlignment = HorizontalAlignment.Center;
imageDescriptionText.Width = pageDescription.PageSize.Width / 2;
imageDescriptionText.TextWrapping = TextWrapping.WrapWholeWords;
printLayout.Children.Add(imageDescriptionText);
}
// Add the print layout to the list of preview pages.
printPreviewPages.Add(printLayout);
// Report the number of preview pages created.
PrintDocument printDocument = (PrintDocument)sender;
printDocument.SetPreviewPageCount(printPreviewPages.Count,
PreviewPageCountType.Intermediate);
}