Как дождаться окончания загрузки нокаута перед печатью в 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.

Я получаю только пустую страницу.

Я предполагаю, что происходит то, что FinishLoadingFrameEvent основного фрейма запускается до выполнения Javascript - или-- событие запускается после выполнения Javascript, но до обновления связанных элементов HTML.

Я могу заставить печать работать, добавив следующий код прямо перед вызовом печати:

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

Вызов ExecuteJavaScriptAndReturnValue, кажется, работает, но я не знаю, надежно ли это. Есть ли верный способ заставить DOM обновляться на основе базовой модели KO?

Сама страница содержит блок скрипта, который вызывает ko.applyBindings(), и, если я выполню это вместо "окна", он также, похоже, будет работать.

Это надежно, хотя? Похоже на взлом.

1 ответ

Решение

Кажется, что модель DOM генерируется после загрузки страницы. В этом случае DotNetBrowser сообщает, что страница загружена, но содержимое еще не обновлено библиотекой Knockout.

Есть несколько вариантов для этого случая.

Опция 1:

Выполните ko.ApplyBindings(), как вы упомянули. После выполнения метода содержимое веб-страницы должно быть загружено и готово к печати.

Вариант 2:

Уведомить сторону.NET о том, что контент загружается с помощью JS-.NET Bridge. В этом случае вам нужно внедрить объект.NET в Javascript. Этот объект должен содержать метод, который запускает печать. После загрузки DOM Knockout должен вызвать этот метод.

Другие вопросы по тегам