如何在DotNetBrowser打印之前等待淘汰页面完成加载?

时间:2017-06-21 05:27:41

标签: knockout.js dotnetbrowser

我正在尝试使用这样的代码使用DotNetBrowser进行打印:

    public void PrintUrl(string url)
    {
        using (var browser = BrowserFactory.Create())
        {
            browser.PrintHandler = this;
            _waitEvent = new ManualResetEvent(false);

            browser.FinishLoadingFrameEvent += (sender, e) => 
            {
                if (e.IsMainFrame)
                {
                    browser.Print();
                }
            };

            browser.LoadURL(url);
            _waitEvent.WaitOne();
        }
    }

    public PrintStatus OnPrint(PrintJob printJob)
    {
        printJob.PrintJobEvent += (sender, args) => _waitEvent.Set();
        return PrintStatus.CONTINUE;
    }

我尝试打印的页面是使用Knockout呈现的。 HTML元素绑定到Javascript Knockout模型。执行Javascript并更新HTML时,模型已初始化。

我只得到一个空白页。

我假设发生的是在执行Javascript之前触发主框架的FinishLoadingFrameEvent - 要么 - 在Javascript执行之后但在更新绑定的HTML元素之前触发事件。

我可以通过在打印电话之前添加以下代码来实现打印:

        browser.FinishLoadingFrameEvent += (sender, e) => 
        {
            if (e.IsMainFrame)
            {
                // executing javascript seems to update the DOM
                browser.ExecuteJavaScriptAndReturnValue("window"); 
                browser.Print();
            }
        };

调用ExecuteJavaScriptAndReturnValue似乎可行,但我不知道这是否可靠。是否有一种确定的方法可以根据底层KO模型更新DOM?

页面本身包含一个调用ko.applyBindings()的脚本块,如果我执行它而不是" window"它似乎也有效。

这可靠吗?感觉就像一个黑客。

1 个答案:

答案 0 :(得分:0)

似乎在加载页面后生成DOM模型。在这种情况下,DotNetBrowser报告该页面已加载但Knockout库尚未更新内容。

这种情况的选择很少。

选项1:

执行' ko.ApplyBindings()'如你所说。方法执行后,应加载网页内容并准备打印。

选项2:

通知.NET端有关使用JS-.NET Bridge加载内容的信息。在这种情况下,您需要将.NET对象注入Javascript。该对象应包含启动print的方法。加载DOM后,Knockout应调用此方法。