【发布时间】:2018-03-21 16:02:36
【问题描述】:
我有一个带有嵌入式 WebView 的基本 UWP 应用程序,该应用程序显示一个相当大的 HTML 文档(最多 500 个字母大小的打印页面)。
我想添加对打印该 HTML 文档的支持。这是我的方法:
- 为了支持分页,我生成了第二个 HTML 文档,通过为每个“页面”使用
<div style="height:100vh">将其分成多个“页面”,最多 500 个。 - 我将该“分页”HTML 加载到第二个隐藏的
WebViewXAML 页面上,我根据用户选择的页面大小调整大小以恰好适合一个页面。 - 我正在等待 WebView 完成加载...
- 现在对于每个“页面”:
- 我将 WebView 的
scrollY设置为使用 JavaScript 仅显示当前页面:window.scrollTo(0, -pageOffset) - 然后我使用
WebViewBrush在WebView中捕获当前页面的快照 - 对所有剩余页面重复此操作...
- 我将 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 分。
【问题讨论】:
标签: printing webview uwp windows-10 uwp-xaml