Silverlight和JavaScript通信

时间:2009-06-12 05:05:35

标签: javascript silverlight

我正在花时间让Silverlight和JavaScript相互通信。

在page.xaml.cs文件中,我将类标记为 ScriptableType ,将两个方法标记为 ScriptableMember 。然后我宣布:

HtmlPage.RegisterScriptableObject("Page", this);

当我尝试调用任一方法时,我得到obj.Content.Page未定义:

var obj = document.getElementById('silverlightControl');
alert(obj);               // [object HtmlObjectElement]
alert(obj.Content);       // Content
alert(obj.Content.Page);  // obj.Content.Page is undefined
alert(obj.Content.Page.GetRegion());

另一方面,在page.xaml.cs中的方法内部,我正在调用:

HtmlPage.Window.Invoke("mapRegionChanged", GetRegion());

我在JavaScript中有一个相应的方法,永远不会被调用:

function mapRegionChanged(region) {
    alert("Region changed: " + region);
}

Silverlight对象声明如下:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
    width="151px" height="77px" id="silverlightControl">
    <param name="onload" value="regionsLoaded" />
    <param name="source" value="<%= Url.Content("~/ClientBin/Worldmap.xap") %>" />
    <param name="onerror" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="2.0.31005.0" />
    <param name="autoUpgrade" value="true" />
    <param name="enableHtmlAccess" value="true" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" />
    </a>
</object>

UserControl在XAML中定义为:

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Worldmap.Page"
Width="151" Height="77" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
<Grid x:Name="LayoutRoot" Background="White" Width="151" Height="77" Cursor="Hand" MouseMove="OnMouseMove" MouseLeftButtonUp="OnMouseUp" MouseLeave="OnMouseLeave">

4 个答案:

答案 0 :(得分:1)

我遇到了这个问题。 Firefox是我的默认浏览器,因此是Visual Studio(实际上是VWD,但无论如何)启动的浏览器。在开发过程中,我将JavaScript调用代码添加到客户端页面,发现在FireFox中的DOM中找不到Silverlight组件的“content”子成员 - 但它可以在IE中找到。我重新启动了Visual Studio Web服务器(系统托盘中的那些),嘿,presto - 它在Firefox中运行!这个问题似乎是由那些Web服务器中的Silverlight组件缓存引起的。

答案 1 :(得分:1)

确保启用HTML访问:

在C#中

        System.Windows.Interop.SilverlightHost host = Application.Current.Host;
        System.Windows.Interop.Settings settings = host.Settings;

        bool enableAcces = settings.EnableHTMLAccess;
        enableAcces = true;
HTML中的

<param name="enablehtmlaccess" value="true" />

这对我有用。

答案 2 :(得分:0)

如果您发现FireFox和IE之间存在某些不兼容性,我们需要进行报告。可能是页面上JS中的其他内容,或者它可能是FF3中的设置(如flashblock类型的东西)

答案 3 :(得分:0)

前几天我读过php架构师杂志,有一篇关于Silverlight的文章解释了如何与javascript通信,你可能想看一下。

转到http://www.phparch.com并注册以便您可以下载该杂志,然后您必须下载2009年5月的期刊,所有其他问题必须付费但我的帐户中的这个问题是免费的,我希望您的也是如此,如果你不能下载它只是让我知道,我可以通过电子邮件发送给你PDF。

以下是下载它的直接链接: https://store-phpa.phparch.com/c/phpa/magazine/pickup/97

祝你好运, 亚历