我有一个带有嵌入式WebView的基本UWP应用,该Web View呈现了一个相当大的HTML文档(最多500个字母大小的打印页面)。
我想增加对打印该HTML文档的支持。这是我的方法:
<div style="height:100vh">
来生成分解为“页面”的第二个HTML文档。 WebView
中,我根据用户选择的页面大小将其调整大小以恰好适合一个页面。 scrollY
设置为使用JavaScript仅显示当前页面:window.scrollTo(0, -pageOffset)
WebViewBrush
在WebView
中捕获当前页面的快照问题:
我可以生成所有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
之后调用WebViewBrush
的WebView.LoadCompleted
方法。
关于printing - 如何等待WebViewBrush.Redraw()完成(UWP打印)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49411176/