简体   繁体   中英

Invalid Pointer error trying to call silverlight method from javascript

From the silverlight app

public MainPage()
{
    InitializeComponent();

    HtmlPage.RegisterScriptableObject("MainPage", this);
}

[ScriptableMember]
public void StartEditLocation(string name, int? top, int? left)
{
    MapTitle.Text = "Set Contract Location - " + name;
    LocationEllipse.SetValue(Canvas.LeftProperty, left ?? 30);
    LocationEllipse.SetValue(Canvas.TopProperty, top ?? 30);
}

And from the javascript

<object data="data:application/x-silverlight-2," id="admin_map" type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="/ClientBin/AdminMap.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="4.0.50826.0" />
    <param name="autoUpgrade" value="true" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
</object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe>

function show_map(top, left) {
    var control = document.getElementById("admin_map");
    var values = new Array();
    values[0] = $('#Name').val();
    values[1] = top;
    values[2] = left;
    if (control)
        control.Content.MainPage.StartEditLocation(values);
    else
        alert('Error loading map');
}

It seems to be a problem actually calling the method because it gets past the if checking to make sure the control exists. I think it must be some syntax error or something simple like that.

You are passing a javascript array instead of the values. Try with this:

control.Content.MainPage.StartEditLocation($('#Name').val(), top, left);

I found the problem, I had the div that the silverlight was in hidden by default, so it was never actually initializing. When I have it visible and immediately hide it on page load using javascript it initializes right away and successfully calls the method.

You could also guard against calling the method on the unloaded silverlight control.

function show_map(top, left) {
var control = document.getElementById("admin_map");
var values = new Array();
values[0] = $('#Name').val();
values[1] = top;
values[2] = left;
if (control)
    if (control.IsLoaded) {
        control.Content.MainPage.StartEditLocation(values);
    }
else
    alert('Error loading map');

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM