다음을 통해 공유


인쇄 미리 보기 UI 사용자 지정하기

이 항목은 인쇄 미리 보기 UI에서 인쇄 옵션 및 설정을 사용자 지정하는 방법을 설명합니다. 인쇄에 대해 자세히 알아보려면 앱에서 인쇄를 참조하세요.

인쇄 옵션 사용자 지정하기

기본적으로 인쇄 미리 보기 UI에는 ColorMode, CopiesOrientation 인쇄 옵션이 표시됩니다. 또한 이러한 옵션 외에도 인쇄 미리 보기 UI에 추가할 수 있는 몇 가지 일반적인 프린터 옵션이 있습니다.

이러한 옵션은 StandardPrintTaskOptions 클래스에 정의됩니다. 인쇄 미리 보기 UI에 표시된 옵션 목록에서 옵션을 추가하거나 제거할 수 있습니다. 표시되는 순서를 변경하고 사용자에게 표시되는 기본 설정을 설정할 수도 있습니다.

그러나 이러한 방식으로 수정한 내용은 인쇄 미리 보기 UI에만 영향을 줍니다. 사용자는 인쇄 미리 보기 UI에서 추가 설정을 탭하여 프린터에서 지원하는 모든 옵션에 항상 액세스할 수 있습니다.

표시할 옵션 정의하기

인쇄를 위해 앱을 등록할 때(앱에서 인쇄 참조) 해당 등록의 일부에는 PrintTaskRequested 이벤트 처리기 정의가 포함됩니다. 인쇄 미리 보기 UI에 표시되는 옵션을 사용자 지정하는 코드가 PrintTaskRequested 이벤트 처리기에 추가됩니다.

PrintTaskRequested 이벤트 처리기에서 PrintTask를 만든 후 인쇄 미리 보기 UI에 표시된 옵션 항목이 포함된 DisplayedOptions 목록을 가져올 수 있습니다. 옵션을 삽입, 추가, 제거 또는 다시 정렬하여 이 목록을 수정할 수 있습니다.

참고 항목

앱에서 표시할 인쇄 옵션을 지정할 수 있지만, 선택한 프린터에서 지원하는 인쇄 옵션만 인쇄 미리 보기 UI에 표시됩니다. 선택한 프린터에서 지원하지 않는 옵션이 인쇄 UI에 표시되지 않습니다.

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;
}

기본 옵션 지정하기

옵션의 기본값을 인쇄 미리 보기 UI에서 설정할 수도 있습니다. 마지막 예시에서 다음의 코드 줄은 MediaSize 옵션의 기본값을 설정합니다.

// Preset the default value of the print media size option.
printTask.Options.MediaSize = PrintMediaSize.NorthAmericaLegal;

참고 항목

DisplayedOptions 목록에서 값을 설정할 때 StandardPrintTaskOptions에서 가져오는 이름(예: StandardPrintTaskOptions.MediaSize)을 사용합니다.

옵션의 기본값을 설정하는 경우 PrintTaskOptions(예: PrintTaskOptions.MediaSize)를 사용합니다.

사용자 지정 인쇄 옵션 추가

여기서는 새 사용자 지정 인쇄 옵션을 만들고, 옵션이 지원하는 값 목록을 정의한 다음, 인쇄 미리 보기에 옵션을 추가하는 방법을 보여 줍니다. 이 예제에서 사용자 지정 인쇄 옵션을 사용하면 페이지에서 텍스트만 인쇄할지, 이미지만 인쇄할지 또는 텍스트와 이미지 둘 다를 인쇄할지 지정할 수 있습니다. 옵션은 드롭다운 목록에 표시됩니다.

좋은 사용자 환경을 보장하기 위해 시스템에서는 앱이 PrintTaskRequestedEventArgs.Request.Deadline지정된 시간 내에 PrintTaskRequested 이벤트를 처리해야 합니다. 따라서 PrintTaskRequested 처리기만 사용하여 인쇄 작업을 만듭니다. 인쇄 설정 사용자 지정은 인쇄 문서 원본이 요청될 때 수행할 수 있습니다. 여기서는 람다 식을 사용하여 PrintTask에 더 쉽게 액세스할 수 있는 PrintTaskSourceRequestedHandler 인라인을 정의합니다.

먼저 PrintTaskOptionDetails 개체와 DisplayedOptions 목록을 가져옵니다. 이를 사용하여 인쇄 미리 보기 UI에 새 인쇄 옵션을 추가합니다.

다음으로 드롭다운 목록에서 사용자 지정 인쇄 옵션을 표시하려면 PrintTaskOptionDetails.CreateItemListOption을 호출하여 PrintCustomItemListOptionDetails 개체를 만듭니 다. 새로운 인쇄 옵션을 만들고 옵션 값 목록을 초기화합니다. 마지막으로 DisplayedOptions 목록에 새 옵션을 추가하고 OptionChanged 이벤트에 대한 처리기를 할당합니다. 기본 옵션 목록의 끝에 새 인쇄 옵션을 추가하기 때문에 DisplayedOptions 목록을 지울 필요가 없습니다. 새 옵션만 추가합니다.

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;
    });
}

옵션은 인쇄 미리 보기 UI에 추가된 순서와 동일한 순서로 표시되며, 첫 번째 옵션이 창 맨 위에 표시됩니다. 이 예시에서는 옵션 목록의 맨 아래에 표시되도록 사용자 지정 옵션이 마지막으로 추가됩니다. 그러나 목록의 아무 곳에나 배치할 수 있습니다. 사용자 지정 인쇄 옵션을 마지막으로 추가할 필요는 없습니다.

사용자가 사용자 지정 옵션에서 선택한 옵션을 변경하면 선택한 옵션을 사용하여 인쇄 미리 보기 이미지를 업데이트합니다. 인쇄 미리 보기 레이아웃이 업데이트된 후 InvalidatePreview 메서드를 호출하여 다음과 같이 인쇄 미리 보기 UI에서 이미지를 다시 그리세요.

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();
        });
    }
}

페이지에서 사용자 지정 옵션의 사용을 지원하려면 사용 가능한 옵션에 대한 열거형과 선택한 옵션을 저장할 페이지 수준 변수를 추가합니다.

internal enum PageLayoutOption : int
{
    Text = 1,
    Images = 2,
    TextAndImages = 3
}

PageLayoutOption pageLayoutOption = PageLayoutOption.TextAndImages;

그런 다음 인쇄 미리 보기의 콘텐츠를 추가하는 페이지 매김 처리기에서 선택한 옵션을 사용합니다.

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);
}

참고 항목