UWP应用如何添加新打印页或从下一页开始打印?
嘿,我来帮你搞定这个UWP打印跳页的问题!你提到用RichTextBlockOverflow没成功,大概率是没找对适配打印分页的正确姿势,下面给你几个实用的解决方案,按需选就行:
方法1:给内容加强制分页标记(最简单直接)
UWP的RichTextBlock自带分页控制属性,你只需要在想要跳页的位置,给下一段内容设置PageBreakBefore="True",就能让这段内容直接从新页面开始打印,相当于自动跳过当前页的剩余空间。
比如XAML里这么写:
<RichTextBlock x:Name="PrintContent"> <!-- 这里是你不想继续打印的当前页内容 --> <Paragraph>这是当前页的内容,之后要强制跳页</Paragraph> <!-- 下一段直接从新页开始 --> <Paragraph PageBreakBefore="True"> 这是下一页的起始内容,会单独占一页打印 </Paragraph> </RichTextBlock>
如果是代码动态生成内容,就这么加:
var newPageParagraph = new Paragraph(); newPageParagraph.PageBreakBefore = true; newPageParagraph.Inlines.Add(new Run { Text = "新页的内容" }); PrintContent.Blocks.Add(newPageParagraph);
方法2:自定义分页器跳过整页(适合完全跳过某一页的场景)
如果你是想直接跳过某一页(比如第一页完全不打印,从第二页开始),那自定义DocumentPaginator是更靠谱的方式,直接控制打印时的页面输出逻辑。
先写一个自定义分页器类:
public class SkipPagePaginator : DocumentPaginator { private readonly DocumentPaginator _originalPaginator; private readonly int _pageToSkip; // 要跳过的页面索引(比如0是第一页) public SkipPagePaginator(DocumentPaginator original, int skipIndex) { _originalPaginator = original; _pageToSkip = skipIndex; } public override DocumentPage GetPage(int pageNumber) { // 如果当前请求的是要跳过的页面,直接返回下一页的内容 if (pageNumber == _pageToSkip) { // 注意处理边界,别越界 return pageNumber + 1 < _originalPaginator.PageCount ? _originalPaginator.GetPage(pageNumber + 1) : DocumentPage.Missing; } // 其他页面要调整索引(因为跳过了一页) var adjustedIndex = pageNumber > _pageToSkip ? pageNumber + 1 : pageNumber; return adjustedIndex < _originalPaginator.PageCount ? _originalPaginator.GetPage(adjustedIndex) : DocumentPage.Missing; } // 重写必要的属性 public override bool IsPageCountValid => _originalPaginator.IsPageCountValid; public override int PageCount => _originalPaginator.PageCount - 1; // 减去跳过的一页 public override Size PageSize { get => _originalPaginator.PageSize; set => _originalPaginator.PageSize = value; } public override IDocumentPaginatorSource Source => _originalPaginator.Source; }
然后在打印任务里用上这个分页器:
private async void TriggerPrint() { var printManager = PrintManager.GetForCurrentView(); printManager.PrintTaskRequested += OnPrintTaskRequested; await PrintManager.ShowPrintUIAsync(); } private void OnPrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args) { var printTask = args.Request.CreatePrintTask("跳过指定页打印", reqArgs => { // 获取原始分页器,这里假设你的打印内容是RichTextBlock var originalPaginator = PrintContent.DocumentPaginator; // 创建自定义分页器,跳过第0页(第一页) var customPaginator = new SkipPagePaginator(originalPaginator, 0); reqArgs.SetSource(customPaginator); }); }
关于你之前用的RichTextBlockOverflow
这个控件主要是用来处理内容溢出到其他容器的场景,比如打印多页时自动把超出当前页的内容放到下一个RichTextBlockOverflow里。如果之前没成功,可能是没把它和打印模板的分页逻辑绑定好——不过相比上面两种方法,它的复杂度更高,除非你需要复杂的多页流式布局,否则优先用前面的方法更省心。
内容的提问来源于stack exchange,提问作者Kibria
相关产品推荐
相关产品推荐

