Как я могу общаться между приложением Windows Forms и элементом управления WebBrowser? - PullRequest
1 голос
/ 09 декабря 2011

Существует ли какой-либо механизм, с помощью которого я могу помещать данные в элемент управления веб-браузера из приложения, содержащего формы Windows. В частности, элемент управления webbrowser содержит некоторые knockout.js, и я хочу разрешить некоторым внешним событиям, таким как изменения определенных файлов в локальной файловой системе, обновить нокаут viewModel.

В данный момент у меня это работает по моде с JS в элементе управления web-браузером, который отправляет длинные запросы jsonp к микро-серверу, который я написал, запустив его в приложении Windows Form (обратите внимание, что это не то место, где веб-страница сам по себе является сервером от jsonp. Кроме того, микро-сервер в основном просто httpListner). Когда приложение форм получает событие изменения файла, оно возвращает ответ через микро-сервер, который обновляет нокаут-модель представления.

Проблема в том, что все это кажется хрупким - если файловые события происходят быстро и быстро, их можно начать пропускать - похоже, мой микро-сервер пытается вернуть несколько результатов в один поток. Я могу это исправить, но в целом это выглядит противно и хрупко.

Вопрос заключается в следующем: я упускаю какой-либо гораздо более простой способ заставить содержащее приложение что-то сигнализировать (то есть передать немного JSON) на веб-страницу, выполняемую в webbrowsercontrol (без обновления страницы!)

1 Ответ

1 голос
/ 09 декабря 2011

Вы можете создать элемент, скажем, div с идентификатором

<div id='external-json' data-bind='jsonHandler : {}' style='display:none'></div>

Затем напишите json для этого div из вашего приложения winforms.

var myJson = "{test : 1}";
this.browser.Document.Body.GetElementById("external-json").innerText = myJson; 

Вы можете даже создать пользовательскую привязку нокаута, чтобы реагировать на это

    ko.bindingHandlers.jsonHandler = {
        update: function(element, valueAccessor) {
        //do something with the json
        var json = element.innerText;
        var obj = eval(json); //hmm
        alert(obj.test); 
    }
};

Это, очевидно, простой пример, и вы, вероятно, могли бы значительно улучшить идею, вам может понадобиться очередь сообщений, возможно, вызов функции в вашем клиентском скрипте вместо использования элемента.

...