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

时间:2011-10-27 20:18:13

标签: c# javascript xbap

我正在尝试使用XBAP来获取TWAIN图像,但我甚至没有达到那么远。我似乎无法获得BrowserInteropHelper.HostScript以允许我在主页上回复javascript。

  • 我在iframe中运行XBAP。
  • 我尝试了完全信任(即使这应该是一个要求)。
  • 我正在测试IE9,.NET Framework 4.0
  • BrowserInteropHelper.HostScript不为null,我可以使用常规窗口方法,如.Close()。

我的代码如下所示:

的index.html:

<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" />

Page1.xaml.cs:

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模式,否则它不起作用。

6 个答案:

答案 0 :(得分:3)

在IE9中,您可以使用窗口方法,因此可以尝试使用setTimeout

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

答案 1 :(得分:1)

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

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

IE settings

答案 2 :(得分:1)

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

答案 3 :(得分:1)

事实上这已经很久了,但我想插手,因为我已经解决了这个问题并且这是一个丑陋的问题。

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

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

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

无论出于何种原因,ScriptInteropHelper在IE9中都存在问题。它没有受到微软的太多关注,可能是因为它功能模糊。也就是说,特别是因为IE7和IE8有各种各样的怪癖,你必须在兼容模式下运行才会非常烦人。有许多MSDN文章,例如this oneenter 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));