问题标签 [htmlbridge]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
864 浏览

javascript - 将 Silverlight 类型传递给 Microsoft AJAX 并传递参数验证

我正在开发一个希望利用 Microsoft ASP.NET AJAX 客户端库的 Silverlight 应用程序。我正在使用作为 Silverlight 2 一部分的 HTML Bridge 调用该库。Silverlight 对在 JavaScript 和托管代码之间传递类型提供了很好的支持,但现在我遇到了一个问题。

Microsoft ASP.NET AJAX 客户端库包括一个“类型系统”,框架所做的其中一件事是验证参数的类型是否正确。我正在调用的特定函数是Sys.Application.addHistoryPoint,验证代码如下所示:

我尝试将各种 CLR 类型作为状态参数传递(C# 结构、[ScriptableTypes]、字典类型等。每次我收到错误时:

“Sys.ArgumentTypeException:‘函数’类型的对象无法转换为‘对象’类型

这个错误显然来自参数验证......但是为什么 ASP.NET AJAX 认为我的类型是函数?有人了解 MS AJAX 中的类型验证吗?

我知道我可以做一些变通方法,比如调用HtmlPage.Window.Eval("...")并将我的 JS 集成作为字符串传递,但我不想这样做。我想传递一个真正的 .NET 类型作为状态参数。

0 投票
1 回答
186 浏览

javascript - LocationCollection 未标记为 ScriptableType 但可以在脚本中实例化(怎么会?)

我正在开发一个小型silverlight 应用程序,该应用程序涉及在javascript 和silverlight 之间传递一些数据。我也在使用silverlight虚拟地球控制。

我遇到的奇怪之处是可以将 Microsoft.Maps.MapControl.LocationCollection 注册为脚本可创建类型并实例化并将其传递给 ScriptableMember。这很棒,但我看不到 LocationCollection 被标记为 ScriptableType 的位置——我是否遗漏了一些明显的东西。

App.xaml.cs 中的代码 - Application_Startup

有效的Javascript代码!

我认为为了在 JavaScript 中实例化类的实例,需要将类型标记为 [ScriptableType] 并且需要将类型注册为可创建类型。据我所知,LocationCollection(或其任何超类)具有此属性。

有人可以帮我解决这个问题吗?

0 投票
3 回答
1710 浏览

javascript - 使用 Silverlight 的 HtmlPage.PopupWindow() 关闭弹出窗口时的通知

我正在使用该HtmlPage.PopupWindow()方法从 Silverlight 应用程序中弹出一个 HTML 页面。我正在尝试处理从 Silverlight 中关闭弹出窗口的事件。这就是我尝试这样做的方式:

然而,事件处理程序似乎永远不会被调用。这是可能的还是我错过了什么?

Silverlight 应用程序和 HTML 弹出页面位于同一个域中,但它们实际上位于不同的端口上。我在想也许在不同端口上的页面会被认为是跨站点限制并导致 JavaScript 失败。

0 投票
1 回答
196 浏览

javascript - 触发 SilverLight 方法的 Javascript 按钮?

我创建了一个 Silverlight 应用程序,它基本上从存储在 JSON 字符串中的数据构建多层球体(想想同心圆)的横截面图像。JSON 字符串是一个直径+颜色值的数组,如下所示:

我的一切都在 Silverlight 中工作。当我用上面的 JSON 在浏览器中加载应用程序时,我成功得到了两个同心圆的渲染,内圆是白色的 (#ffffff),直径为 100 像素,外圆是红色 (#ff0000),带有直径为 150 像素。伟大的。

现在,我必须将其集成到 HTML 页面中,并将 JSON 数据从 javascript 传递到 Silverlight。我正在使用 SIlverlight 提供的 HTMLBridge 功能,但在调用从 Javascript 构建可视化项的 Silverlight 方法时遇到问题。

Silverlight 中的方法名称是 BuildViz(),它从 Silverlight 画布中删除所有现有元素,然后从名为 JSONData 的公共属性重新构建可视化。JSONData 在设置它的值时调用 BuildViz() 方法:

我尝试使用 HTMLBridge 将 JSONData 暴露给 javascript 并通过 javascript 设置它的值,但似乎没有调用 BuildViz() 方法(或者它被调用但它对我的画布没有影响)。不知道从这里去哪里。我在网上看到的 HTMLBridge 示例非常基础,只处理简单的方法,例如将字符串转换为大写并将其值返回给调用 javascript。我需要在 Silverlight 中实际运行一个方法。

任何帮助将不胜感激。

TIA

0 投票
1 回答
393 浏览

javascript - 我可以在 Silverlight 中的 Scriptable Member 属性上设置 Javascript 中的实例属性吗?

我的 Silverlight 控件中有以下 (2) 个“ScriptableMember”类型:

这里的目的显然是允许通过 Javascript 中的 HTML 桥进行公开。调用“消息”属性是微不足道的,并且可以完美地如下所示:

但是,我无法通过在 JS 中深入研究其属性来设置实例属性的值。我认为的代码应该如下:

请注意我如何在“MType”中添加,然后访问其名为“Name”的公共属性之一。MyCustomType 类根据需要具有所有适当的“ScriptableMember”属性。

但是,当运行上面的那一行时,我收到以下错误:

“Microsoft JScript 运行时错误:对象不支持此属性或方法”

它在“消息”的分配上工作得很好。在 JS 中是否可以向下钻取实例属性并分配其变量?如果是这样,我的 JS 不正确,或者我需要做什么来解决这个问题。谢谢!

0 投票
2 回答
943 浏览

c# - 为什么我的 JavaScript 数组不能转换为适当的类型?

我在通过 HTMLBridge 将 JavaScript 数组和字典类型对象传递给我的托管代码中的方法时遇到了一些问题。Microsoft文章中详细介绍此主题和网络的信息让我无处可去。

使用链接文章中的以下信息:

NET Framework 属性或类型为对象的输入参数在按值封送至目标 .NET Framework 属性或输入参数时使用以下启发式方法进行转换:

JavaScript 数组转换为object[].

JavaScript 字典被转换为Dictionary<string,object>.

...我尝试以多种方式将数组和字典对象传递给我的托管代码,但没有成功:

Javascript:

C#(尝试#1):

C#(尝试#2):

C#(尝试#3):

例外的形式是(其中“TARGET TYPE”是由显式或隐式强制转换(包括Object[])产生的对象的预期类型:

SCRIPT16389:System.ArgumentException:无法将此对象转换为指定类型TARGET TYPE。参数名称:targetType

在 System.Windows.Browser.ScriptObject.ConvertTo(类型 targetType,布尔 allowSerialization)

在 System.Windows.Hosting.ScriptingInterface.GetScriptParamValueForType(ScriptParam scriptParam,键入所需类型)

在 System.Windows.Hosting.ScriptingInterface.ConvertFromScriptParams(ParameterInfo[] 参数,ScriptParam[] args)

在 System.Windows.Browser.ManagedObjectInfo.ScriptMethod.Invoke(ManagedObject obj,InvokeType invokeType,ScriptParam[] args)

在 System.Windows.Browser.ManagedObjectInfo.Invoke(ManagedObject obj,InvokeType invokeType,String memberName,ScriptParam [] args)

在 System.Windows.Hosting.ManagedHost.InvokeScriptableMember(IntPtr pHandle,Int32 nMemberID,Int32 nInvokeType,Int32 nArgCount,ScriptParam [] pArgs,ScriptParam & pResult,ExceptionInfo & pExcepInfo)

(类似的尝试将字典对象作为 传递给 C# Dictionary<string, object>)。

这些尝试是否是对上述文章及其他文章中信息的误解的结果?还是我的实现根本不正确?

附录:

我知道用ScriptObject.getProperty()完成我想要的方法,但如果可能的话,我想处理具体的、精确的类型。更不用说如果键值不能像前两者一样拆箱,它会返回本机类型、String 或 ScriptObject。我讨厌被简化为在任意嵌套的对象上反复调用它,直到我到达一个本机类型。