다음과 같은 코드를 사용하여 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 모델에 바인딩됩니다. 모델은 자바 스크립트가 실행되고 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"대신 실행하면 작동하는 것 같습니다.
그래도 신뢰할 수 있습니까? 해킹처럼 느껴집니다.
페이지가로드 된 후 DOM 모델이 생성되는 것 같습니다. 이 경우 DotNetBrowser는 페이지가로드되었지만 Knockout 라이브러리에 의해 콘텐츠가 아직 업데이트되지 않았다고보고합니다.
이 경우에는 몇 가지 옵션이 있습니다.
옵션 1:
언급 한대로 'ko.ApplyBindings ()'를 실행합니다. 메서드 실행 후 웹 페이지 콘텐츠가로드되고 인쇄 할 준비가되어 있어야합니다.
옵션 2 :
컨텐츠가 JS-.NET Bridge를 사용하여로드 되었음을 .NET 측에 알립니다 . 이 경우 .NET 객체를 Javascript에 삽입해야합니다. 해당 개체에는 인쇄를 시작하는 메서드가 포함되어야합니다. DOM이로드 된 후 Knockout은이 메서드를 호출해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다