2017-06-21 87 views
0

我想用这样的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; 
    } 

我想打印的页面与淘汰赛呈现。 HTML元素绑定到Javascript Knockout模型。当执行Javascript并更新HTML时,模型被初始化。

我只得到一个空白页。

我认为正在发生的是主框架的FinishLoadingFrameEvent执行之前的JavaScript - 或 - 的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()的脚本块,如果我执行,而不是“窗口”它似乎也工作。

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

回答

0

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

这种情况有几种选择。

选项1:

执行 'ko.ApplyBindings()' 为你所提到的。在执行方法之后,应该加载网页内容并准备好打印。

选项2:

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

+0

感谢尤金,我们现在可能会选择1。 – Hawk

相关问题