C# XBAP中的BrowserInteropHelper.HostScript无法使用自定义函数

C# XBAP中的BrowserInteropHelper.HostScript无法使用自定义函数,c#,javascript,xbap,C#,Javascript,Xbap,我正在尝试使用XBAP来获取TWAIN图像,但我甚至没有走那么远。我似乎无法让BrowserInteropHelper.HostScript允许我与主机页上的javascript对话 我正在iframe中运行XBAP 我尝试了完全信任(尽管这应该是一个要求) 我正在测试IE9、.NETFramework 4.0 BrowserInteropHelper.HostScript不是null,我可以使用普通的窗口方法,如.Close() 我的代码如下所示: Index.html: 我得到: 新信息

我正在尝试使用XBAP来获取TWAIN图像,但我甚至没有走那么远。我似乎无法让BrowserInteropHelper.HostScript允许我与主机页上的javascript对话

  • 我正在iframe中运行XBAP
  • 我尝试了完全信任(尽管这应该是一个要求)
  • 我正在测试IE9、.NETFramework 4.0
  • BrowserInteropHelper.HostScript不是null,我可以使用普通的窗口方法,如.Close()
我的代码如下所示:

Index.html: 我得到: 新信息:
这个场景在网络上的其他PC上正常工作,我找到了原因。IE9的默认设置为“在兼容性视图中显示intranet站点”。这将导致页面以“IE7模式”呈现,并且可以从XBAP获得javascript函数。如果我单击文档模式:(在F12开发者工具控制台下)并切换到IE9模式,那么它将不再工作(如上所述)。在我自己的电脑上,它默认使用IE9模式(应该是这样),除非我手动切换到IE7模式,否则它不会工作。

这是由于IE的安全设置。 如果从本地驱动器打开页面,IE默认会阻止脚本。 IE应将警告消息显示为“为了帮助保护您的安全,Internet Explorer已限制…”

但是,您可以更改设置
选中复选框“允许活动内容在我的计算机上的文件中运行”


IE9不会公开
BrowserInteropHelper.HostScript
,除非它处于兼容模式。

这是事实之后的事情,但我想插话,因为我已经解决了这个问题,而且这个问题很糟糕

正如您所观察到的,它运行的机器之所以工作,是因为它们在兼容模式下运行。通过向html文档中添加以下标记,可以指示IE9使用兼容模式呈现页面:

<meta http-equiv="X-UA-Compatible" content="IE=8"/>

我有信心地说,添加这个标签是你唯一的“解决方案”。我花了几个星期寻找一个更好的,这是我仍然坚持的一个


无论出于何种原因,
ScriptInteropHelper
在IE9中充满了问题。它并没有得到微软的太多关注,可能是因为它的功能晦涩难懂。这就是说,特别是因为IE7和IE8有各种各样的怪癖,你不得不在兼容模式下运行,这是非常恼人的。例如,有许多MSDN文章进一步讨论了这个问题。

在IE9中,您可以使用窗口方法,因此您可以尝试设置超时

BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);

BrowserInteropHelper.HostScript.setTimeout(“WorkDamnit()”,0)

它可以工作,但如果我想向js发送回调函数,我如何使用setTimeout发送对象


当用于ie8时 它工作得很好

dynamic host = BrowserInteropHelper.HostScript;
host.sampleJSFunction(new CallbackObject(this));

如果有人还在想这个问题,我找到了一个解决方案。基本上,通过document对象,您可以在最新浏览器和HTML5 doctype中正常通信,而无需任何黑客攻击

我写了一篇包含代码和示例的博客文章:

快速解释了这一点:

Javascript

document.ResponseData = function (responseData) {
    alert(responseData);
}
C#XBAP


然后可以使用它将C#对象传递给Javascript,并用作“代理”对象。查看该博客文章以了解如何使用该选项。

检查此选项不起作用,但它在其他一些工作站(Win7/IE9和XP/IE8)上起作用,因此您可能走上了正确的道路。我只是希望在我的电脑上有一些指示,说明为什么它不允许这样做。我认为这个选项不适用,因为脚本正在(并且已经)运行。我就是无法从XBAP访问这些功能。如果直接从file://URI打开hmtl文件,我确实会收到脚本警告。另一种解决方法是在html页面中添加web标记(MOTW),请参见“谢谢”,但我没有遇到此问题。“允许活动内容”对我的问题没有影响,只是兼容模式。最后,我使用了ActiveX扫描控件。它可以工作,并且不会强迫我使用兼容模式(另外,我发现了一个包含activex和npapi版本的兼容模式,因此它可以在大多数浏览器中工作)。Silverlight似乎仍受支持,但XBAPs已被遗忘。您好,我可以知道您选择了什么ActiveX控件吗?您是说只使用
BrowserInteropHelper.HostScript.document
,而不使用
BrowserInteropHelper.HostScript
?不完全正确。可以通过BrowserInteropHelper.HostScript.document从C#调用将函数扩展到document对象。
BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);
dynamic host = BrowserInteropHelper.HostScript;
host.sampleJSFunction(new CallbackObject(this));
document.ResponseData = function (responseData) {
    alert(responseData);
}
var hostScript = BrowserInteropHelper.HostScript;
hostScript.document.ResponseData("Hello World");