我正在尝试使用这样的代码使用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"它似乎也有效。
这可靠吗?感觉就像一个黑客。
答案 0 :(得分:0)
似乎在加载页面后生成DOM模型。在这种情况下,DotNetBrowser报告该页面已加载但Knockout库尚未更新内容。
这种情况的选择很少。
选项1:
执行' ko.ApplyBindings()'如你所说。方法执行后,应加载网页内容并准备打印。
选项2:
通知.NET端有关使用JS-.NET Bridge加载内容的信息。在这种情况下,您需要将.NET对象注入Javascript。该对象应包含启动print的方法。加载DOM后,Knockout应调用此方法。