如何等待WebViewBrush.Redraw()完成(UWP打印)?

2024-04-13

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

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

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

问题:

我可以生成所有 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 积分。


根据重要部分WebViewBrush remarks https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.webviewbrush#remarks:

WebView 控件具有固有的异步行为,当其内容完全加载时,会重新绘制控件。但是,一旦解析了 XAML(可能是在 WebView 加载 URI 内容之前),关联的 WebViewBrush 就会呈现。或者,您可以等待在源内容完全加载之前在 WebViewBrush 上调用 SetSource(例如,通过在 WebView.LoadCompleted 事件的处理程序中调用 SetSource)。

这样你就可以打电话SetSource的方法WebViewBrush after WebView.LoadCompleted https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.webview.loadcompleted.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待WebViewBrush.Redraw()完成(UWP打印)? 的相关文章

  • 了解 Windows 10 何时处于平板电脑模式 - Windows 10 / Windows 10 Mobile

    我致力于开发适用于 Windows 10 和 Windows 10 Mobile 的通用应用程序 有谁知道如何检查 Windows 10 是否在平板电脑模式下运行 我在这里找到了这个问题 但这是针对 Windows 窗体的 如何在 Wind
  • 在PC上的Firefox上模拟Android的Webview?

    作为我的软件开发工作 针对 Android 的一部分 我需要在通过 Android 的 WebView 查看时检查大量 HTML 页面的内容 到目前为止 我已经能够通过将 HTML 内容转储到文件中来实现这一点 data data
  • 防止 XAML/C# 中 ListView 的 Return(Enter)、向上和向下箭头键的默认行为 (Windows 10)

    当列表视图具有焦点时 按 Enter 键的默认行为是选择列表视图的第一个元素 向上和向下箭头键滚动列表视图 我试图阻止这种默认行为并连接我的自定义逻辑 我可以使用 KeyDown 为列表视图实现访问键 如下所示 代码隐藏方法 CoreWin
  • Webview 不显示带有颜色的文本

    在我的应用程序中 我在 webview 中显示一些 Html 内容 String webViewConent this is some span style color 2ecc71 sample span string webView l
  • 打印富文本框

    我正在制作一个简单的 WinForms 应用程序 我想允许用户从 RichTextBox 打印文本 我跟着MSDN链接 https msdn microsoft com en us library cwbe712d v vs 110 asp
  • 像 Gmail 应用程序一样处理 Android WebView 中的外部链接

    我是一名网络开发人员 我目前正在 Android Studio 上使用 WebView 开发 Android 应用程序 该 WebView 将我的网站作为 Android 应用程序访问 我的一个网页包含许多外部链接 我的目标是让 Andro
  • 强制加载 WPF 视觉对象的适当方法

    我一直在努力使用打印System Printing http msdn microsoft com en us library system printing aspx命名空间 我终于发现 在使用部分 API 时得到空白结果的原因是Visu
  • Webview没有清除缓存

    为了清除 WebView 的缓存 我使用了 webview getSettings setAppCacheEnabled false webview clearCache true webview loadUrl about blank w
  • JavaScript接口注入漏洞修复

    我收到了来自 Google Play 管理中心的警告 提示我这一页 https support google com faqs answer 9095419因为我在我的应用程序中使用了 JavaScript 接口 并建议两个选项来解决该问题
  • WebView (OSX) 未在打印面板预览中呈现

    我的应用程序创建并打印 WebView 输出页面正在正确组装和打印 但我没有在打印面板中预览页面 NSRect printViewFrame printViewFrame size width paperSize width marginL
  • 使用 MVVM 在 WPF 中打印 TreeView

    我有一个树视图来从文本文件返回文本搜索结果
  • 在 UWP(W10) 中使用 HttpClient 发出 POST 请求

    我正在使用通用 Windows 平台制作应用程序 我想问如何使用 httpclient 将 id 1 这样的数据发布到服务器 我知道网上有一些教程 但其中很多都是针对 Windows 8 1 的 在 10 中不起作用 如果你想在UWP中处理
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa
  • XAML 自定义文本框光标停留在输入开始处

    我正在致力于为 Windows 8 1 Universal UWP 的 XAML 应用程序创建自定义控件 并不断发现细微差别 我似乎找不到任何有关创建现有控件 如 TextBox 的自定义实现的优秀教程 因此我一直在浏览 Telerik 等
  • NativeScript:禁用 iOS WebView 缩放控件的方法?

    我正在尝试找出一种方法来防止用户通过捏合手势和双击来放大和缩小 iOS WebView tns ios 3 4 1 本质上禁用所有缩放 就像苹果之前使用的 html 元标记一样让用户决定是否要使用 iOS 10 及更高版本进行缩放 我找到了
  • WebView2 在没有 WebView2 运行时的情况下工作

    我们尝试在没有 WebView2 运行时的情况下使用 WebView2 因为它的大小为 100 MB 并将其分发给客户端 它在 2 台 PC 上进行了测试 两者都有相同版本的 Edge 在 PC1 上 如果没有 WV2 运行时 WebVie
  • 无法在 Android 中调整 Web 视图的大小

    我正在尝试调整大小Web View在安卓中 第一次单击时 Web 视图会扩展为新大小 但第二次单击时 它不会恢复为我指定的旧大小 任何帮助表示赞赏 public class MainActivity extends Activity Rel
  • TabHost 中的 Webview = 以黑屏启动

    我正在尝试在有 4 个选项卡的 tabhost 中使用 webview 所有选项卡都链接到同一个 webview 这很好 除了一个问题 启动时 网络视图是黑色的 单击选项卡 2 3 或 4 使其 活跃起来 我的快速解决方法是使用 setCu
  • 切换 PC 时,InkCanvas 笔画未以正确的边界渲染

    我有一个 UWP 应用程序 使用带有加载和保存墨迹按钮的 UWP InkCanvas 我在一台笔记本电脑上使用该应用程序进行了绘图 将墨迹保存为 gif 嵌入 isf 并将 gif 文件发送到另一台屏幕较小的笔记本电脑上进行尝试 当使用同一
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic

随机推荐