【问题标题】:Page break using Print Helper extension of windows-community-toolkit使用 windows-community-toolkit 的 Print Helper 扩展分页
【发布时间】:2020-07-11 17:04:20
【问题描述】:

我正在使用windows-community-toolkitPrintHelper 扩展名并打印一些数据。问题是当数据很大时它与页面重叠,我找不到动态添加新页面并将数据转移到下一页的方法。有什么办法吗?

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

结果如下所示。可以看出,如果数据很大,则不会打印,因为不会自动添加下一页。我可以这样做是手动循环数据并准确定义要在一页上打印多少行以及在下一页上打印多少行,但这不是我想要的,因为如果某些单元格数据很大,那么我的逻辑将不起作用。

【问题讨论】:

    标签: c# printing uwp windows-community-toolkit


    【解决方案1】:

    派生自此document。您可以在单独的页面上打印长 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);
    }
    

    【讨论】:

    • 这就是我提到的,我可以通过循环和手动定义在一页上打印多少行来完成。但是,如果单元格有大量数据并且该行将占用更多高度(空间),则此逻辑将失败,在这种情况下数据将再次减少。
    • 是的,我知道,但是目前DataGrid没有api可以自动剪切数据。所以我们需要根据 DataGrid 内容高度和单元格高度计算可用页数。
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2021-08-04
    • 2022-12-11
    相关资源
    最近更新 更多