我有一个带有嵌入式WebView的基本UWP应用,该Web View呈现了一个相当大的HTML文档(最多500个字母大小的打印页面)。

我想增加对打印该HTML文档的支持。这是我的方法:

  • 为了支持分页,我通过为每个“页面”(最多500个)使用<div style="height:100vh">来生成分解为“页面”的第二个HTML文档。
  • 我将“分页”的HTML加载到XAML页面上的第二个隐藏的WebView中,我根据用户选择的页面大小将其调整大小以恰好适合一个页面。
  • 我等待WebView完成加载...
  • 现在每个“页面”:
  • 我将WebView的scrollY设置为使用JavaScript仅显示当前页面:window.scrollTo(0, -pageOffset)
  • 然后我使用WebViewBrushWebView中捕获当前页面的快照
  • 对其余所有页面重复此操作...

  • 问题:

    我可以生成所有500页的打印预览,但是有时预览会丢失页面,而其他页面会多次显示。

    我怀疑这是因为我使用WebViewBrush.Redraw()捕获滚动的WebView的快照,但是文档说Redraw() 异​​步发生。在WebViewBrush有机会重绘之前,我可能会滚动浏览当前页面,从而意外捕获下一页。

    如何确保WebViewBrush捕获了WebView,以便可以滚动到下一页?

    我的代码生成一个页面:
        private async Task<Rectangle> MakePage(WebView webView,
                            Size pageSize, double pageOffset)
        {
            // Scroll to next page:
            await webView.EvaluateJavaScriptSnippetAsync(
                                 $"window.scrollTo(0, {pageOffset})");
    
            var brush = new WebViewBrush();
            brush.Stretch = Stretch.Uniform;
            brush.SetSource(webView);
            brush.Redraw(); // XXX Need to wait for this, but there's no API
    
            // Add a delay hoping Redraw() finishes... I think here is the problem.
            await Task.Delay(150);
    
            var rectangle = new Rectangle()
            {
                Width = pageSize.Width,
                Height = pageSize.Height
            };
    
            rectangle.Fill = brush;
            brush.Stretch = Stretch.UniformToFill;
            brush.AlignmentY = AlignmentY.Top;
    
            return rectangle;
        }
    

    注意:如果有使用WebViewBrush来打印500页的替代方法,我欢迎您提出建议。我尝试为每个页面使用单独的WebView,但是该应用程序在200页后耗尽了内存。

    赏金:我开始了赏金计划,向可以弄清楚如何打印500页的所有人提供100分。

    最佳答案

    根据 WebViewBrush remarks的“重要”部分:



    这样您就可以在 SetSource 之后调用WebViewBrushWebView.LoadCompleted方法。

    关于printing - 如何等待WebViewBrush.Redraw()完成(UWP打印)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49411176/

    10-12 16:48