2017-06-21 47 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

相關問題