3

我无法使用 Richeditbox 进行多页打印。我在 Xaml 中有名为 Editor 的 Richeditbox。我使用自定义 GetText() 函数来获取编辑器内的所有内容。我已经能够用单页打印,但不知道如何制作多页。

我试图查看 Microsoft 文档和这个PrintHelper 类。我仍然不确定我应该如何将它实施到我的项目中。

所以主要问题是我应该如何使用richeditbox 打印多个页面?

下面是我的项目打印代码,是的,我知道有硬编码: printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final); 但不知道我应该如何计算那些页面

 private PrintManager printMan;
 private PrintDocument printDoc;
 private IPrintDocumentSource printDocSource;

public MainPage()
{
    InitializeComponent();
    // Register for PrintTaskRequested event
    printMan = PrintManager.GetForCurrentView();
    printMan.PrintTaskRequested += PrintTaskRequested;

    // Build a PrintDocument and register for callbacks
    printDoc = new PrintDocument();
    printDocSource = printDoc.DocumentSource;
    printDoc.Paginate += Paginate;
    printDoc.GetPreviewPage += GetPreviewPage;
    printDoc.AddPages += AddPages;
}

private async void Print_Click(object sender, RoutedEventArgs e)
{
    if (PrintManager.IsSupported())
    {
        try
        {
            // Show print UI
            await PrintManager.ShowPrintUIAsync();
        }
        catch
        {
            // Printing cannot proceed at this time
            ContentDialog noPrintingDialog = new ContentDialog()
            {
                Title = "Printing error",
                Content = "\nSorry, printing can' t proceed at this time.",
                PrimaryButtonText = "OK"
            };
            await noPrintingDialog.ShowAsync();
        }
    }
    else
    {
        // Printing is not supported on this device
        ContentDialog noPrintingDialog = new ContentDialog()
        {
            Title = "Printing not supported",
            Content = "\nSorry, printing is not supported on this device.",
            PrimaryButtonText = "OK"
        };
        await noPrintingDialog.ShowAsync();
    }

}

private void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
    // Create the PrintTask.
    // Defines the title and delegate for PrintTaskSourceRequested
    var printTask = args.Request.CreatePrintTask("Print", PrintTaskSourceRequrested);

    // Handle PrintTask.Completed to catch failed print jobs
    printTask.Completed += PrintTaskCompleted;
}

private void PrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
{
    // Set the document source.
    args.SetSource(printDocSource);
}

private void Paginate(object sender, PaginateEventArgs e)
{
    printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
}

private void GetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
    string text = GetText(); ;
    RichEditBox richTextBlock = new RichEditBox();
    richTextBlock.Document.SetText(TextSetOptions.FormatRtf, text);
    richTextBlock.Background = new SolidColorBrush(Windows.UI.Colors.White);
    printDoc.SetPreviewPage(e.PageNumber, richTextBlock);
}


private void AddPages(object sender, AddPagesEventArgs e)
{
    string text = GetText(); ;
    RichEditBox richTextBlock = new RichEditBox();
    richTextBlock.Document.SetText(TextSetOptions.FormatRtf, text);
    richTextBlock.Background = new SolidColorBrush(Windows.UI.Colors.White);
    richTextBlock.Padding = new Thickness(20,20,20,20);
    printDoc.AddPage(richTextBlock);

    // Indicate that all of the print pages have been provided
    printDoc.AddPagesComplete();
}

private async void PrintTaskCompleted(PrintTask sender, PrintTaskCompletedEventArgs args)
{
    // Notify the user when the print operation fails.
    if (args.Completion == PrintTaskCompletion.Failed)
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
        {
            ContentDialog noPrintingDialog = new ContentDialog()
            {
                Title = "Printing error",
                Content = "\nSorry, failed to print.",
                PrimaryButtonText = "OK"
            };
            await noPrintingDialog.ShowAsync();
        });
    }
}
4

1 回答 1

5

RichTextBlock 具有 OverflowContentTarget 属性。您应该在那里指定 RichTextBlockOverflow 控件。RichTextBlockOverflow 控件也可能有OverflowContentTarget。因此,您添加附加页面并查看它是否有溢出内容。不适合页面的内容流向下一个溢出控制等。因此,您一页一页地渲染页面,直到没有溢出,此时您知道页数。

正是我所说的,但在他们的官方文档中:

lastRTBOOnPage = AddOnePrintPreviewPage(null, pageDescription);

   // We know there are more pages to be added as long as the last RichTextBoxOverflow added to a print preview
   // page has extra content
   while (lastRTBOOnPage.HasOverflowContent && lastRTBOOnPage.Visibility == Windows.UI.Xaml.Visibility.Visible)
   {
         lastRTBOOnPage = AddOnePrintPreviewPage(lastRTBOOnPage, pageDescription);
   }

MS docs skip important points and hard to understand. The best documentation on printing is this blog by Diederic Krols. There is also nice article written by him how to print from ItemsControl. (but it's more advanced) It's for windows 8, but API didn't change since that time.

enter image description here

于 2018-10-19T03:44:59.383 回答