我有一个基本的 UWP 应用程序,带有嵌入式 WebView,可呈现相当大的 HTML 文档(最多 500 个字母大小的打印页面)。
我想添加对打印该 HTML 文档的支持。这是我的方法:
- 为了支持分页,我使用
<div style="height:100vh">
对于每个“页面”,最多 500 个。
- 我将“分页”HTML 加载到第二个隐藏的 HTML 中
WebView
在 XAML 页面上,我根据用户选择的页面大小调整大小以恰好适合一页。
- 我等待 WebView 完成加载......
- Now for each "page":
- 我设置了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 页后耗尽内存。
BOUNTY:我发起了一项悬赏活动,向任何能弄清楚如何打印 500 页的人提供 100 积分。