是否有任何机制可以将数据从包含的Windows窗体应用程序推送到Web浏览器控件中。具体来说,webbrowser控件包含一些knockout.js,我想允许一些外部事件,例如更改本地文件系统中的某些文件来更新knockout viewModel。
目前我已经开始使用这个工作了,在webbrowser控件中使用JS发出一个longpolling jsonp请求到我在windows窗体应用程序中运行的微博客服务器(注意这不是网页的地方)因为jsonp本身就是服务器。而且,微网络服务器基本上只是一个httpListner)。当表单应用程序收到文件更改事件时,它会通过微型网络服务器返回响应并更新淘汰视图模型。
问题是这一切都感觉很脆弱 - 如果文件事件变得越来越快,它们就会开始被跳过 - 看起来我的微型网络服务器试图将多个结果返回到同一个流。我可以解决这个问题,但整体看起来很讨厌和脆弱。
问题是:我错过了任何更简单的方法让包含应用程序信号(即传递一些JSON)到webbrowsercontrol中运行的网页(没有页面刷新!)
答案 0 :(得分:1)
你可以创建一个元素,比如一个带有id的div
<div id='external-json' data-bind='jsonHandler : {}' style='display:none'></div>
然后从winforms app中将json写入此div ..
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);
}
};
这显然是一个简单的例子,您可能会大量改进这个想法,您可能需要一个消息队列,可能需要在客户端脚本中调用一个函数而不是使用该元素。