簡體   English   中英

如何將 JavaScript function 傳遞給 Silverlight?

[英]How can I pass a JavaScript function to Silverlight?

我正在評估 JavaScript/Silverlight 互操作功能,並且已經能夠使用 JavaScript 創建一個 Silverlight 實例並在其上調用方法。 但是,我現在需要一種將 JavaScript 回調 function 傳遞給 Silverlight 的方法。

只需將 JavaScript function 傳遞給期望操作的 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 端,您需要將 class 注冊為可編寫腳本的 object。 然后創建一個標記為 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);
      }
    }
}

On the JavaScript side you can call the RegisterCallback method that you defined in Silverlight by grabbing the silverlight object on the page and calling the method off of the name "silverlightInterop" which we registered as the name of our scriptable object.

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

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

我希望這有幫助。 我也有一些示例代碼演示了我不久前在這里寫的

有一種更簡單的方法可以將 Javascript function 傳遞給 Silverlight。 javascript 中的所有值都可以用ScriptObject類型表示,這包括 function。 出於這個原因, ScriptObject有一個InvokeSelf方法。

您可以創建一個簡單的屬性:-

 [ScriptableMember]
 public ScriptObject Callback { get; set; }

現在讓我們說在 Javascript 我們有這個 function:-

function sayHello(name)
{
    alert("Hello " + name);
}

我們可以使用這個 JS 將它分配給屬性(假設RegisterScriptableObject("Page", this)已經完成):-

document.getElementById("mySL").Content.Page.Callback = sayHello;

現在在 Silverlight 代碼中,我們可以調用此回調:-

Callback.InvokeSelf("Freed");

我的代碼:

<!-- language: JavaScript -->
function sendText() {
    return "Hi from Javascript!";
}

<!-- language: C# -->
string obj = HtmlPage.Window.Invoke("sendText", null) as string;
txtReturnData.Text = obj;

<!-- language: VB.Net -->
Dim obj As String = TryCast(HtmlPage.Window.Invoke("sendText", Nothing), String)
txtReturnData.Text = obj

顯然,如果使用 EventHandler(或 EventHandler<>)的委托類型,這確實有效,但不適用於其他委托類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM