Разрыв страницы с использованием расширения Print Helper в windows -community-toolkit - PullRequest
0 голосов
/ 11 июля 2020

Я использую PrintHelper расширение windows-community-toolkit и печатаю некоторые данные. Проблема в том, что когда данные большие, они перекрывают страницу, и я не могу найти способ динамически добавить новую страницу и перенести данные на следующую страницу. Есть способ?

public PrintHelper PrintHelper;

public void StartPrint(Panel container, List<CompanyDetail> PrintSampleItems)
{
    try
    {
        PrintHelper = new PrintHelper(container);
        PrintHelper.OnPrintSucceeded += PrintHelper_OnPrintSucceeded;
        PrintHelper.OnPrintFailed += PrintHelper_OnPrintFailed;
        PrintHelper.OnPreviewPagesCreated += PrintHelperOnOnPreviewPagesCreated;
        var pageNumber = 0;

        var data = PrintSampleItems;

        var grid = new Grid();
        grid.RowDefinitions.Add(new RowDefinition() {Height = GridLength.Auto});
        grid.RowDefinitions.Add(new RowDefinition() {Height = new GridLength(1, GridUnitType.Star)});
        grid.RowDefinitions.Add(new RowDefinition() {Height = GridLength.Auto});

        // Static header
        var header = new TextBlock
        {
            Text = "Departments Print",
            Margin = new Thickness(0, 0, 0, 20),
            HorizontalAlignment = HorizontalAlignment.Center,
            FontSize = 18,
            FontWeight = FontWeights.Bold
        };
        Grid.SetRow(header, 0);
        grid.Children.Add(header);

        var dataGrid = new CompanyDetailReportTemplateControl
        {
            HorizontalAlignment = HorizontalAlignment.Center
        };
        dataGrid.SetValues(PrintSampleItems);

        Grid.SetRow(dataGrid, 1);
        grid.Children.Add(dataGrid);


        // Footer with page number
        pageNumber++;
        var footer = new TextBlock
        {
            Text = $"Page [ {pageNumber} ]", Margin = new Thickness(0, 20, 0, 0),
            HorizontalAlignment = HorizontalAlignment.Right
        };
        Grid.SetRow(footer, 2);
        grid.Children.Add(footer);


        PrintHelper.AddFrameworkElementToPrint(grid);

    }
    catch
    {
    }
}

Результат выглядит так. Как видно, если данные большие, они не печатаются, потому что следующая страница не добавляется автоматически. Я могу вручную зацикливать данные и точно определять, сколько строк нужно напечатать на одной странице и сколько на следующей, но это не то, что я хочу, потому что, если некоторые данные ячеек велики, мои logi c не будут работать.

Распечатать изображение

1 Ответ

0 голосов
/ 13 июля 2020

Получено из этого документа . вы можете напечатать длинный DataGrid на отдельной странице, но нам все равно нужно вручную разбивать ваши данные на страницы с выделенным кодом. Например, если мы хотим сократить источник данных до десяти на страницу, нам нужно вырезать данные, как показано ниже.

private PrintHelper _printHelper;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    _printHelper = new PrintHelper(CustomPrintContainer);

    var pageNumber = 0;

    for (int i = 0; i < Items.Count; i = i + 10)
    {
        var grid = new Grid();
        grid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
        grid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });

        // Static header
        var header = new TextBlock { Text = "Custom Print", Margin = new Thickness(0, 0, 0, 20) };
        Grid.SetRow(header, 0);
        grid.Children.Add(header);

        // Main content with layout from data template
        var dataGrid = new DataGrid();
        dataGrid.AutoGenerateColumns = true;
        dataGrid.ItemsSource = Items.Skip(i).Take(10);
        Grid.SetRow(dataGrid, 1);
        grid.Children.Add(dataGrid);

        // Footer with page number
        pageNumber++;
        var footer = new TextBlock { Text = string.Format("page {0}", pageNumber), Margin = new Thickness(0, 20, 0, 0) };
        Grid.SetRow(footer, 2);
        grid.Children.Add(footer);

        _printHelper.AddFrameworkElementToPrint(grid);
    }

    _printHelper.OnPrintCanceled += _printHelper_OnPrintCanceled;
    _printHelper.OnPrintFailed += _printHelper_OnPrintFailed;
    _printHelper.OnPrintSucceeded += _printHelper_OnPrintSucceeded;

    var printHelperOptions = new PrintHelperOptions(false);
    printHelperOptions.Orientation = Windows.Graphics.Printing.PrintOrientation.Default;
    printHelperOptions.AddDisplayOption(StandardPrintTaskOptions.Orientation);
    await _printHelper.ShowPrintUIAsync("print sample", printHelperOptions);
}
...