javascript - 如何将 JavaScript 函数传递给 Silverlight?

标签 javascript silverlight callback interop

我正在评估 JavaScript/Silverlight 互操作功能,并且已经能够使用 JavaScript 创建 Silverlight 实例并在其上调用方法。但是,我现在需要一种将 JavaScript 回调函数传递给 Silverlight 的方法。

简单地将 JavaScript 函数传递给需要 Action 的 Silverlight 方法是行不通的,尽管错误表明它是有意的。我错过了什么?异常详情:

Microsoft JScript runtime error: System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure)
   at System.Windows.Hosting.ScriptingInterface.GetDelegateForScriptObject(Type eventHandlerType, ScriptObject obj)
   at System.Windows.Browser.ScriptObject.ConvertTo(Type targetType, Boolean allowSerialization)
   at System.Windows.Hosting.ScriptingInterface.GetScriptParamValueForType(ScriptParam scriptParam, Type desiredType)
   at System.Windows.Hosting.ScriptingInterface.ConvertFromScriptParams(ParameterInfo[] parameters, ScriptParam[] args)
   at System.Windows.Browser.ManagedObjectInfo.ScriptMethod.Invoke(ManagedObject obj, InvokeType invokeType, ScriptParam[] args)
   at System.Windows.Browser.ManagedObjectInfo.Invoke(ManagedObject obj, InvokeType invokeType, String memberName, ScriptParam[] args)
   at System.Windows.Hosting.ManagedHost.InvokeScriptableMember(IntPtr pHandle, Int32 nMemberID, Int32 nInvokeType, Int32 nArgCount, ScriptParam[] pArgs, ScriptParam& pResult, ExceptionInfo& pExcepInfo)

最佳答案

没有看到您的代码,我不能说您做错了什么,但我可以描述过去对我有用的东西。

在 Silverlight 端,您需要将一个类注册为可编写脚本的对象。然后创建一个标记为 ScriptableMember 的方法,并采用将作为您传入 JavaScript 方法的字符串。我还添加了一个名为 InvokeCallback 的方法,它将调用传入的 javascript 回调。

[ScriptableType]
public partial class Page : UserControl
{
    private string jsCallback;
    public Page()
    {
        InitializeComponent();
        HtmlPage.RegisterScriptableObject("silverlightInterop", this);
    }


    [ScriptableMember]
    public void RegisterCallback(string callback)
    {
      jsCallback = callback;
    }

    public boid InvokeCallback(string arg)
    {
      if(!string.IsNullOrEmpty(jsCallback))
      {
          System.Windows.Browser.HtmlPage.Window.Invoke(jsCallback, arg);
      }
    }
}

在 JavaScript 方面,您可以调用您在 Silverlight 中定义的 RegisterCallback 方法,方法是抓取页面上的 silverlight 对象并从我们注册为脚本对象名称的名称“silverlightInterop”调用该方法。

function jsCallback(someArg) {
   alert(someArg);
}

var silverLightControl = document.getElementById("silverlightControl");
silverLightControl.content.silverlightInterop.RegisterCallback("jsCallback");

希望对您有所帮助。我还有一些示例代码演示了我刚才写的 here

关于javascript - 如何将 JavaScript 函数传递给 Silverlight?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6508195/

相关文章:

javascript - bootstrapTable() 方法在表数据下留下空白空间

javascript - 如何将输入文本中的值传输到按钮?

.net - 扩展方法是否太昂贵?

silverlight - 如何为 Phone7 Silverlight 应用程序使用 {x :Static . ..} 扩展?

javascript - 将 Geolocation API 编写为 Angular 的 Promise 或 Observable

c - 了解 C 中回调的情况

javascript - 如何在嵌入数据上调用鼠标函数?

javascript - 在线文本编辑器如何工作?

银光 3 : ListBox DataTemplate HorizontalAlignment

javascript - 从类中发出事件