UWP richeditbox распечатать несколько страниц - PullRequest
0 голосов
/ 18 октября 2018

Мне не удалось сделать многостраничную печать с Richeditbox.У меня есть Richeditbox в Xaml по имени редактор.Я использую пользовательскую функцию 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();
        });
    }
}

1 Ответ

0 голосов
/ 19 октября 2018

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 пропускают важные пункты и их трудно понять.Лучшая документация по печати - это блог от Diederic Krols.Есть также хорошая статья , написанная им, как печатать из ItemsControl.(но он более продвинутый) Это для Windows 8, но API не изменился с того времени.

enter image description here

...