我正在尝试使用XBAP来获取TWAIN图像,但我甚至没有达到那么远。我似乎无法获得BrowserInteropHelper.HostScript以允许我在主页上回复javascript。
我的代码如下所示:
<p id="someP">My cat's breath smells like cat food.</p>
<script type="text/javascript">
function WorkDamnit() {
$('#someP').hide();
}
</script>
<iframe src="@Url.Content("~/XBAPs/WPFBrowserApplication1.xbap")" style="border: none;" width="500" height="500" />
private void Button_Click(object sender, RoutedEventArgs e)
{
if (BrowserInteropHelper.HostScript == null)
throw new ApplicationException("hostscript is null");
else
BrowserInteropHelper.HostScript.WorkDamnit();
}
System.MissingMethodException: Method '[object Window].WorkDamnit' not found.
此方案适用于网络上的其他PC,我找到了原因。 IE9默认设置为“在兼容性视图中显示Intranet站点”。这会导致页面以“IE7模式”呈现,并且可以从XBAP获得javascript函数。如果我单击文档模式:(在F12开发人员工具控制台下)并切换到IE9模式,则它不再起作用(如上所述)。在我自己的PC上它默认使用IE9模式(应该这样),除非我手动切换到IE7模式,否则它不起作用。
答案 0 :(得分:3)
在IE9中,您可以使用窗口方法,因此可以尝试使用setTimeout
BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);
答案 1 :(得分:1)
由于IE安全设置。 如果从本地驱动器打开页面,IE默认会阻止脚本。 IE应显示警告消息“'为了帮助保护您的安全,Internet Explorer已限制....”
但是您可以更改设置
选中“允许活动内容在我的计算机上的文件中运行”复选框
答案 2 :(得分:1)
IE9不会公开BrowserInteropHelper.HostScript
,除非它处于兼容模式。
答案 3 :(得分:1)
事实上这已经很久了,但我想插手,因为我已经解决了这个问题并且这是一个丑陋的问题。
正如您所观察到的,它运行的计算机因为它们以兼容模式运行而工作。您可以通过在html文档中添加以下标记来指示IE9使用兼容模式呈现页面:
<meta http-equiv="X-UA-Compatible" content="IE=8"/>
我有信心说,添加此标签是您唯一的“解决方案”。我花了好几个星期寻找一个更好的,这是我仍然坚持的。
无论出于何种原因,ScriptInteropHelper
在IE9中都存在问题。它没有受到微软的太多关注,可能是因为它功能模糊。也就是说,特别是因为IE7和IE8有各种各样的怪癖,你必须在兼容模式下运行才会非常烦人。有许多MSDN文章,例如this one和enter link description here,可以进一步讨论这个问题。
答案 4 :(得分:1)
如果有人仍然想知道这个问题,我找到了一个解决方案。基本上,从文档对象中,您可以正确地进行通信,而无需在最新浏览器和HTML5 doctype中进行任何操作。
我写了一篇包含代码和示例的博客文章:
XBAP and Javascript with IE9 or newer - Solution for MissingMethodException problems
快速解释这是正常的:
的Javascript
document.ResponseData = function (responseData) {
alert(responseData);
}
C#XBAP
var hostScript = BrowserInteropHelper.HostScript;
hostScript.document.ResponseData("Hello World");
然后可以将C#对象传递给Javascript并用作“代理”对象。查看该博客文章,了解如何使用它。
答案 5 :(得分:0)
BrowserInteropHelper.HostScript.setTimeout( “WorkDamnit()”,0);
它的工作但是如果我想将回调函数发送给js我怎么能用setTimeout发送对象?
用于ie8时 它的工作性好
dynamic host = BrowserInteropHelper.HostScript;
host.sampleJSFunction(new CallbackObject(this));