Как вызвать функцию JavaScript на объекте Silverlight 3? - PullRequest
2 голосов
/ 12 января 2010

У меня определен следующий элемент управления Silverlight:

<object id="objImageViewer" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="500px">
    <param name="source" value="../ClientBin/SomeImageViewer.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="3.0.40624.0" />
    <param name="autoUpgrade" value="true" />
    <param name="windowless" value="true" />
    <param name="initParams"
        value="
            Username=<%= ImageViewerUsername %>,
            Editable=<%= ImageViewerEditable ? "1" : "0" %>,
            Align=<%= ImageViewerAlign ? "1" : "0" %>
            " />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
</object>

Я показал следующий метод в моем элементе управления Silverlight (Page.xaml.cs), чтобы он был доступен для Javascript:

[ScriptableMember]
public bool HasPendingUpdates()
{
    return btnSave.IsEnabled;
}

У меня на странице aspx есть функция тестирования Javascript, которая пытается что-то с ней сделать:

var imageViewer = $("#objImageViewer")[0];
if (imageViewer.Content.Page.HasPendingUpdates())
{
    alert("Pending Changes Exist!");
}
else
{
    alert("NO Pending Changes Exist!");
}

Проблема в том, что происходит сбой после объекта Content. Я проверил следующее:

var imageViewer = $("#objImageViewer")[0];

imageViewer // Valid
imageViewer.Content // Valid
imageViewer.Content.Page  // Invalid
imageViewer.Content.HasPendingUpdates()  // Invalid

Так что я не уверен, что я делаю неправильно. Как добраться до функции внутри Контента?

Я использую IE8, Silverlight 3, ASP.NET. Элемент управления silverlight создается с тегом объекта, поскольку я не думаю, что этот элемент управления является опцией в Silverlight 3+.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Вам необходимо зарегистрировать в Silverlight HTMLBridge идентификатор, который будет отображаться в свойстве Content, и дать ему объект, который имеет некоторые точки входа в сценарии.

Я склонен делать это в конструкторе страницы: -

public Page()
{
     InitializeComponent();
     HtmlPage.RegisterScriptableObject("Page", this);
}

Теперь ваш код должен работать.

0 голосов
/ 12 января 2010

У меня есть такая структура приложения Silverlight:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Page uploadControl = new Page();
        // ...
        HtmlPage.RegisterScriptableObject("uploadControl", uploadControl);
    }
}

[ScriptableType]
public partial class Page : UserControl
{
    [ScriptableMember]
    public void StartUpload()
    {
        // ...
    }
} 

И в Javascript:

function startUpload() {
    $find("<%= SilverlightUpload.ClientID %>")
        .get_element().content.uploadControl.StartUpload();
    return false;
}

Итак, я смотрю на этот вызов HtmlPage.RegisterScriptableObject и просто выставляю типы, помеченные как [ScriptableType]

...